关闭 Java InputStreams

2022-08-31 12:50:34

我对使用Java InputStreams时close()方法的使用有一些疑问。从我从大多数开发人员那里看到和读到的内容来看,当不再需要时,您应该始终在 InputStream 上显式调用 close()。但是,今天我正在研究使用Java属性文件,我找到的每个示例都是这样的:

Properties props = new Properties();
try {
    props.load(new FileInputStream("message.properties"));
    //omitted.
} catch (Exception ex) {}

在上面的示例中,无法显式调用 close(),因为 InputStream 在使用后无法访问。我见过许多类似的 InputStreams 用法,尽管它似乎与大多数人关于显式关闭的说法相矛盾。我通读了Oracle的JavaDocs,它没有提到 Properties.load() 方法是否关闭了 InputStream。我想知道这是否通常是可以接受的,或者是否更愿意做一些更像下面的事情:

Properties props = new Properties();
InputStream fis = new FileInputStream("message.properties");
try {
    props.load(fis);
    //omitted.
} catch (Exception ex) {
    //omitted.
} finally {
    try {
        fis.close();
    } catch (IOException ioex) {
        //omitted.
    }
}

哪种方式更好和/或更有效?还是真的重要?


答案 1

属性类将输入流包装在 LineReader 中以读取属性文件。由于您提供了输入流,因此您有责任将其关闭。

第二个例子是到目前为止处理流的更好方法,不要依赖其他人为你关闭它。

你可以做的一个改进是使用IOUtils.closeQuietly()

以关闭流,例如:

Properties props = new Properties();
InputStream fis = new FileInputStream("message.properties");
try {
    props.load(fis);
    //omitted.
} catch (Exception ex) {
    //omitted.
} finally {
    IOUtils.closeQuietly(fis);
}

答案 2

我会尝试使用资源(至少对于Java 7 +):

Properties props = new Properties();

try(InputStream fis = new FileInputStream("message.properties")) {
    props.load(fis);
    //omitted.
} catch (Exception ex) {
    //omitted.
}

退出 try 块时,应自动调用该调用。close()


推荐