【问题标题】:Java BufferedWriter and OutputStream .close() methodJava BufferedWriter 和 OutputStream .close() 方法
【发布时间】:2015-07-21 00:27:15
【问题描述】:

我是 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就可以了?

我的代码一切正常吗?

【问题讨论】:

  • 为什么你认为在这里使用 try-with-resources 很不方便?这似乎是一个完美的候选人。
  • @vs777 我说不方便,因为有 GZIPOutputStream/FileOutputStream 选择逻辑(基于有效负载大小),我希望将其保留在此方法中。所以我不知道在这种情况下如何实现 try-with-resources 。请举个例子好吗?

标签: java outputstream bufferedwriter


【解决方案1】:

不,交给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();
        }
    }

【讨论】:

    【解决方案2】:

    如果你关闭 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);
    }
    

    【讨论】:

    • 是的,但是正如您在我的问题代码中看到的那样,有一个逻辑,我正在检查有效负载的大小,并根据它选择 GZIPOutputStream 或 FileOutputStream。所以,我不知道如何使用那里的资源。有办法吗?
    【解决方案3】:

    关闭BufferedWriter. 就可以了,如果您按照Javadoc 操作,您会看到它关闭了所有嵌套流。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-07
      相关资源
      最近更新 更多