review request for 7021582, use try-with-resources in jar/zip implementation and tests

Xueming Shen xueming.shen at oracle.com
Thu Feb 24 08:36:48 UTC 2011


  Stuart,

Here are my comments on non-pack changes. I'm sure Kumar will look at 
those pack files later.

GetMethodsReturnClones.java: ln#43 diamond conersion?

Available.java: it's not your change, but I believe we should do the 
try-with_resources on the ZipFile zfile as well.

InfoZip.java.: ln#113/114 you probably don't need to separate out the 
"fis" in try-with-resources, the FileInputStream
created should be closed by the ZipInputStream that it is embedded in.

LargeZip.java: ln#101-1-4/148-151, same as above, only need to close 
ZipOut/InputStream

TestEmptyZip.java:
TestEmptyZip.java:
Comment.java: ln#60-62
CorruptedZipFiles.java ln#50
DeleteTempJar.java:
LargeZipFile.java.
ManyEntries.java
ReadZip.java.
ShortRead.java
       only close the ZipIn/OutputStream

-Sherman

On 2011-2-23 22:26, Stuart Marks wrote:
> Hi Sherman, all,
>
> Here's a webrev to convert code in the jar/zip implementation files 
> and tests to use the new Java 7 try-with-resources construct.
>
> http://cr.openjdk.java.net/~smarks/reviews/7021582/webrev.0/
>
> There are rather a lot of files, however, most of the changes are 
> pretty straightforward. A typical conversion changes code like this:
>
>     FileInputStream fis = new FileInputStream(filename);
>     // use fis
>     fis.close();
>
> to this:
>
>     try (FileInputStream fis = new FileInputStream(filename)) {
>         // use fis
>     }
>
> The majority of the conversions are like the above. However, there are 
> a several places where I had to rearrange things either in order to 
> get them to work at all, to improve robustness, or for general cleanup.
>
> Some of these are marked with "TODO". I will of course remove these 
> comments before committing the changes. Where you see these comments, 
> you might want to give the code a bit more scrutiny.
>
> Specific examples of things to look at follow:
>
> * test/java/util/jar/JarEntry/GetMethodsReturnClones.java
>
> I had to change the ordering of local variable declarations so that 
> the variable was visible where it's used. TWR introduces a nested 
> block, so obviously a local declared within will have to be moved 
> outside in order to be used outside. This occurs in several other 
> places as well. In some cases initialization order was changed. This 
> shouldn't matter, though, since it's things like opening a file vs. 
> allocating an array.
>
> * src/share/classes/com/sun/java/util/jar/pack/Driver.java
>
> I narrowed the scope of the open resource. No sense keeping it open 
> any longer than necessary. This occurs in several other places as well.
>
> * src/share/classes/com/sun/java/util/jar/pack/PackageReader.java
> * src/share/classes/com/sun/java/util/jar/pack/PackageWriter.java
>
> These changes rely on recent changes to TWR's handling of null 
> resources. Currently, TWR will avoid calling close if the resource is 
> null. Joe checked in this change just last week. Before that, a null 
> resource would generate an unavoidable NPE when it attempted to call 
> close(). Handling of non-null resources is unchanged.
>
> I don't think the change to null handling is in a promoted build yet. 
> Is it OK to check in code that depends on it? All tests pass, but that 
> just means that the path where the resource is null isn't tested.
>
> * src/share/classes/com/sun/java/util/jar/pack/PropMap.java
>
> Narrowed the scope of catch IOException; should be OK since the code 
> that was migrated out cannot throw IOException.
>
> * src/share/classes/com/sun/java/util/jar/pack/UnpackerImpl.java
>
> This closes its input after successful processing. I changed this so 
> that it also closes its input if an exception is thrown.
>
> * test/java/util/zip/LargeZip.java
>
> I've "unrolled" a cascade of constructors into separate resource 
> variables. This also occurs in several other places. Basically code 
> that used to look like this:
>
>     ZipOutputStream zos = new ZipOutputStream(
>         new BufferedOutputStream(
>             new FileOutputStream(largeFile)));
>     // process zos
>     zos.close();
>
> is converted to this:
>
>     try (FileOutputStream fos = new FileOutputStream(largeFile);
>          BufferedOutputStream bos = new BufferedOutputStream(fos);
>          ZipOutputStream zos = new ZipOutputStream(bos))
>     {
>         // process zos
>     }
>
> I think this more robust, since it closes the FileOutputStream if an 
> exception occurs during the construction of one of the stacked 
> streams, which the original code did not handle. Since the wrapper 
> streams will close their underlying streams, this will result in 
> redundant close() calls. However, close() is supposed to be idempotent 
> so this should be OK.
>
> * test/java/util/zip/ZipFile/DeleteTempJar.java
>
> I'm not sure if this properly handles an IOException caused by 
> HttpExchange.close(). Funny, the method isn't declared to throw IOE, 
> but this test did compile and pass.
>
> * test/java/util/zip/ZipFile/LargeZipFile.java
>
> I changed this to fail the test if close() were to throw IOE. I think 
> this is proper for test code.
>
> * test/java/util/zip/ZipFile/ReadZip.java
>
> I took the liberty of converting the file copying code to use the new 
> java.nio.file.Files utilities. Well, I'm really following Alan's lead 
> here since he's prompted me to do so in other places a couple times 
> already. :-)
>
> Thanks for reviewing!
>
> s'marks




More information about the core-libs-dev mailing list