我是java的新手,有关于BufferedWriter和OutputStream关闭的问题。
我有一些逻辑,使用try-with-resources很不方便:
public static void writeFile(String fileName, String encoding, String payload) {
BufferedWriter writer = null;
OutputStream stream = null;
try {
boolean needGzip = payload.getBytes(encoding).length > gzipZize;
File output = needGzip ? new File(fileName + ".gz") : new File(fileName);
stream = needGzip ? new GZIPOutputStream(new FileOutputStream(output)) : new FileOutputStream(output);
writer = new BufferedWriter(new OutputStreamWriter(stream, encoding));
writer.write(payload);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
writer.close();
stream.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
所以,我必须自己关闭所有资源。我应该关闭OutputStream和BufferedWriter吗?或者可以关闭BufferedWriter?
我的代码一切正常吗?
答案 0 :(得分:1)
关闭BufferedWriter.
是可以的。如果您关注Javadoc,您将看到它关闭所有嵌套流。
答案 1 :(得分:1)
如果关闭BufferedWriter,它的流也将被关闭,但BufferedWriter和OutputStream都实现了Closeable。所以,如果你想要,你可以使用try with resource来处理关闭
例如:
modified = original.replace(/\?.*/, "");
修改:添加了getStream以检查是否需要gzip流或没有
注意:这个答案只是一个"更新"你的代码,我不确定你一般会做什么,所以它可能不是你的程序的最佳解决方案
public static void writeFile(String fileName, String encoding, String payload) {
File output = new File(fileName);
try (OutputStream stream = new FileOutputStream(output);
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(stream, encoding))) {
writer.write(payload);
} catch (IOException e) {
e.printStackTrace();
}
}
答案 2 :(得分:1)
不,把它留给Java,让它来处理它:
ValidationError