在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);
}
}
答案 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警告您时,输出流将不会关闭。您有两种选择:
保留对流的引用并自行关闭。您需要编写正确的try...catch...finally
语句,以确保即使抛出异常也会关闭流。
如果您使用的是Java 7或更高版本,请使用try with resources。当try块存在时,这种新形式的try ... catch语句将自动关闭流。