如何确保关闭I / O流?

时间:2018-09-08 19:15:28

标签: java io

考虑此功能:

import java.io.IOException;
import java.io.Reader;

class StreamPrinter {

    void print(Reader reader) throws IOException {
        int code = reader.read();
        while (code != -1) {
            System.out.print((char) code);
            code = reader.read();
        }

        reader.close();
    }

}

在出现异常和错误的情况下如何关闭流?

4 个答案:

答案 0 :(得分:3)

发布后,您可以使用finally块,如

void print(Reader reader) throws IOException {
    try {
        int code = reader.read();
        while (code != -1) {
            System.out.print((char) code);
            code = reader.read();
        }
    } finally {  
        reader.close();
    }
}

另外,更惯用的写while循环的方式类似于

void print(Reader reader) throws IOException {
    int code;
    while ((code = reader.read()) != -1) {
        System.out.print((char) code);
    }
}

然后使用呼叫者的try-with-resources;喜欢

try (Reader reader = ...) {
    print(reader);
}

答案 1 :(得分:2)

您可以将内容包装在trycatch中,以确保关闭流。

这是一个示例:

 try {
     int code = reader.read();
     while (code != -1) {
        System.out.print((char) code);
        code = reader.read();
     }
 } finally {
    try {
        reader.close();
    } catch(IOException e) {
        // Log here.
    }
 }

最后的try / catch块允许您关闭阅读器,并在发生异常时对异常进行处理。

答案 2 :(得分:0)

您最终必须使用。最终here的更多信息。

这将起作用:

java.lang.String

答案 3 :(得分:0)

您应该能够使用Java 7+ try-with-resources ,而无需更改print方法的API:

import java.io.IOException;
import java.io.Reader;

class StreamPrinter {

    void print(Reader readerArg) throws IOException {
        try (Reader reader = readerArg /* take ownership of the arg */) {
            int code = reader.read();
            while (code != -1) {
                System.out.print((char) code);
                code = reader.read();
            }
        }
    }
}

通常的模式是在资源部分中打开资源。在这种情况下,我们只是分配一个预先存在的资源,以便try可以拥有所有权。

但是,这不是一个好主意。问题是如果在StreamPrinter::print调用之前,资源可能会泄漏。因此,Elliott建议重​​组代码是可取的。