簡體   English   中英

Java BufferedWriter和OutputStream .close()方法

[英]Java BufferedWriter and OutputStream .close() method

我是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?

我的代碼一切正常嗎?

可以關閉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();
        }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM