May I suggest rather:

 try (
   File file = new File(libDir, "tzdb.dat");
   FileInputStream fis = new FileInputStream(file);
   BufferedInputStream bis = new BufferedInputStream(fis, 32000);
   DataInputStream dis = new DataInputStream(bis);
 ) {
   ...



That way, the resources are closed in the reverse order in which they are opened and an exception in the middle of the creation chain does not prevent the earlier resources from being closed.

Regards

Heinz
--
Dr Heinz M. Kabutz (PhD CompSci)
Author of "The Java(tm) Specialists' Newsletter"
Oracle Java Champion 2005-2013
JavaOne Rock Star Speaker 2012
http://www.javaspecialists.eu
Tel: +30 69 75 595 262
Skype: kabutz



Salter, Thomas A wrote:
I noticed recently that the JDK8 JVM was very slow starting on systems where 
the JRE is on a high-latency, remote file system.  I tracked this down to the 
reading of tzdb.dat.  In java/time/zone/TzdbZoneRulesProvider.java and 
sun/util/calendar/ZoneInfoFile.java the tzdb.dat file is read using a 
DataInputStream directly over a FileInputStream.  Consequently there ends up 
being a large number of very small (often a single byte) read requests to the 
underlying O/S file system.  This can be fixed trivially by adding a 
BufferedInputStream between the DataInputStream and the FileInputStream.

Thus this:
try (DataInputStream dis = new DataInputStream( new FileInputStream(new File(libDir, "tzdb.dat")))) { becomes: try (DataInputStream dis = new DataInputStream( new BufferedInputStream( new FileInputStream(new File(libDir, "tzdb.dat")), 32000))) {

Tom Salter | Software Engineer | Java & Middleware Development Unisys | 2476 Swedesford Road | Malvern, PA 19355 | 610-648-2568 | N385-2568


Reply via email to