米奇妙妙流控制小帮手:try-catch-with-resource

前言

我正在处理文件,并且需要对文件进行压缩,这就需要同时用到Java中的GZIPInputStreamByteArrayOutputStream。为了减少出错,需要在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中关闭流了。