前言
我正在处理文件,并且需要对文件进行压缩,这就需要同时用到Java中的GZIPInputStream与ByteArrayOutputStream。为了减少出错,需要在finally中关闭这俩流。
一般的try-catch-finally
对于一般的try-catch-finally,代码就会写成:
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 
 | public static byte[] uncompressImage(String compress) {byte[] compressedBytes = Base64.getDecoder().decode(compress);
 byte[] results = null;
 try {
 ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
 GZIPInputStream gzipIn = new GZIPInputStream(new ByteArrayInputStream(compressedBytes));
 results = CompressUtils.uncompress(gzipIn, outputStream);
 } catch (IOException e) {
 e.printStackTrace();
 } finally {
 try {
 gzipIn.close();
 outputStream.close();
 } catch (IOException e) {
 e.printStackTrace();
 }
 }
 return results;
 }
 
 | 
在finally中套了一层又一层,看起来并不是一个好方法。
try-catch-with-resource
这个其实是Java 7中新加入的特性,可以自动关闭资源。
我们可以直接将需要关闭的内容直接放在try中,然后就可以自动关闭了。看起来非常像C#中的using。
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 
 | public static byte[] uncompressImage(String compress) {byte[] compressedBytes = Base64.getDecoder().decode(compress);
 byte[] results = null;
 try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
 GZIPInputStream gzipIn = new GZIPInputStream(new ByteArrayInputStream(compressedBytes))) {
 results = CompressUtils.uncompress(gzipIn, outputStream);
 } catch (IOException e) {
 e.printStackTrace();
 }
 return results;
 }
 
 | 
这样,我们就不需要额外在finally中关闭流了。