Java BufferedWriter和OutputStream .close()方法

时间:2015-05-10 13:05:58

标签: 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 {
        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?

我的代码一切正常吗?

3 个答案:

答案 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