Java BufferedWriter和OutputStream.close()方法
我是java新手,有一个关于BufferedWriter和OutputStream关闭的问题 我有一些逻辑,使用try with resources不方便:Java BufferedWriter和OutputStream.close()方法,java,outputstream,bufferedwriter,Java,Outputstream,Bufferedwriter,我是java新手,有一个关于BufferedWriter和OutputStream关闭的问题 我有一些逻辑,使用try with resources不方便: public static void writeFile(String fileName, String encoding, String payload) { BufferedWriter writer = null; OutputStream stream = null; try { bool
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
我的代码一切正常吗?只需关闭
BufferedWriter即可。
如果遵循Javadoc,您将看到它关闭所有嵌套流。如果关闭BufferedWriter,其流也将关闭,但BufferedWriter和OutputStream都实现了Closeable。因此,如果您愿意,您可以使用try with resource为您处理关闭
例如:
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();
}
}
编辑:添加了getStream以检查它是否需要gzip流
注意:这个答案只是对您的代码的“更新”,我不确定您通常想做什么,因此它可能不是您程序的最佳解决方案
public static void writeFile(String fileName, String encoding, String payload) {
try (BufferedWriter writer = new BufferedWriter(
new OutputStreamWriter(getStream(fileName, encoding, payload), encoding))) {
writer.write(payload);
} catch (IOException e) {
e.printStackTrace();
}
}
public static OutputStream getStream(String fileName, String encoding, String payload) throws IOException {
boolean needGzip = payload.getBytes(encoding).length > gzipZize;
File output = needGzip ? new File(fileName + ".gz") : new File(fileName);
return needGzip ? new GZIPOutputStream(new FileOutputStream(output)) : new FileOutputStream(output);
}
不,让Java来处理它:
public static void writeFile(String fileName, String encoding,
String payload) {
boolean needGzip = payload.getBytes(Charset.forName(encoding)).length > gzipZize;
File output = needGzip ? new File(fileName + ".gz")
: new File(fileName);
try (OutputStream stream = needGzip ? new GZIPOutputStream(
new FileOutputStream(output)) : new FileOutputStream(output);
BufferedWriter writer = new BufferedWriter(
new OutputStreamWriter(stream, encoding))) {
writer.write(payload);
} catch (IOException e) {
e.printStackTrace();
}
}
为什么您认为在这里使用try with resources不方便?在这里它似乎是一个完美的候选者。@vs777我说不方便,因为有GZIPOutputStream/FileOutputStream选择逻辑(基于负载大小),我希望将其保留在这个方法中。因此,在这种情况下,我不知道如何使用资源实现try。请举个例子好吗?是的,但正如你们在我的问题代码中看到的,有一个逻辑,我在检查有效负载的大小,并根据它,选择GZIPOutputStream或FileOutputStream。所以,我不知道如何使用那里的资源。有办法吗?