在java中关闭FileOutputStream而不引用它?

时间:2018-02-09 15:00:38

标签: java

在java中,我们可以执行以下操作:

new FileOutputStream(new File("dir"));

(不包括会谈的例外处理)。

我们应该以某种方式关闭此实例中的流吗?如果是这样我们怎么做?如果我们不在方法中创建本地引用,例如:

FileOutputStream fos = new FileOutputStream(new File("dir"));

处理第一个例子中显示的流是不好的做法? java在那个实例中处理/关闭自己吗?

使用

时,我收到一些不良的静态代码分析
foo = new FileOutputStream(new File("dir"));

因为流没有关闭,但我无法获得关闭它的句柄?或者我可以,我只是不知道如何。

感谢大家的反馈,对于不使我的例子相关和明确表示道歉。请参阅下面的实际代码:

public void generateEnvironmentProperties() {
        Properties props = new Properties();
        properties.getAllProperties().forEach((k,v) -> props.setProperty(k,v));
        try {
            File f = new File("target\\allure-results\\environment.properties");
            if (!f.getParentFile().mkdirs()) {
                throw new IOException("Unable to create file(s)");
            }
            if (!f.createNewFile()) {
                throw new IOException("Unable to create file(s)");
            }
            props.store(new FileOutputStream(f), "Allure Environment Properties");
        } catch(IOException ioe) {
            LOG.fatal(ioe);
        }
    }

3 个答案:

答案 0 :(得分:3)

正如Properties.store javadoc所说:

  

写入条目后,将刷新输出流。     此方法返回后,输出流保持打开状态。

因此,确实需要您继续使用FileOutputStream您正在使用的实例并自行关闭它。

答案 1 :(得分:2)

您可以使用try-with-resources,这是Java 7功能之一

try(FileOutputStream fos = new FileOutputStream(f)){
    // use resources, for example:
    props.store(fos , "Allure Environment Properties");
} catch (FileNotFoundException e) {
    // exception handling, for example:
    LOG.fatal(ioe);
}

一旦执行try-catch块,资源就会关闭

答案 2 :(得分:0)

props.store(new FileOutputStream(f), "Allure Environment Properties");

不要这样做。当IDE警告您时,输出流将不会关闭。您有两种选择:

  1. 保留对流的引用并自行关闭。您需要编写正确的try...catch...finally语句,以确保即使抛出异常也会关闭流。

  2. 如果您使用的是Java 7或更高版本,请使用try with resources。当try块存在时,这种新形式的try ... catch语句将自动关闭流。