前言
我正在处理文件,并且需要对文件进行压缩,这就需要同时用到Java
中的GZIPInputStream
与ByteArrayOutputStream
。为了减少出错,需要在finally
中关闭这俩流。
一般的try-catch-finally
对于一般的try-catch-finally
,代码就会写成:
1 2 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
。
1 2 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
中关闭流了。