我可以使用try-with-resources与已经创建的InputStream吗?

4
就像这样:
public void myMethod(InputStream fileIn){
    try (InputStream in = fileIn)  {
        do stuff....
    }
}

看起来它能工作。但是它安全吗?

1个回答

12

看起来它能工作

如果在in之前添加InputStream(或一些InputStream的超类型),它就可以工作: 语言规格要求你必须为每个资源声明一个变量。

try (InputStream in = fileIn) { ... }

或者在Java 9+中直接引用fileIn:

try (fileIn) { ... }

它能够正常工作,没有理由不这样做:使用变量声明形式,您将表达式赋值给变量(一个新类,方法调用的结果,数组元素等)。资源无法确定它是否正在获取“新”实例:它只是一个具有正确类型值的东西。

它安全吗?

取决于你所指的“安全”的确切含义。

在这段代码中,它肯定是安全的,因为它可以正常运行,并且 in.close() 将在块结束时被调用。

但是,它违反了一个经验法则:“如果您没有打开流,请勿关闭它”。因此,在其他部分程序期望调用该方法后流仍然保持打开状态时,它可能会导致意外故障,从而可能是不安全的。


谢谢!是的,那是我打错了,我确实有 try(InputStream in = fileIn) - mal
我已经修复了这个问题。 - mal
也许我需要重新考虑我的策略,以便在打开/关闭流方面更加得当。再次感谢! - mal
1
这只是一个经验法则;并没有说你必须遵循它。稍微更一般的形式是“如果你不拥有一个流,就不要关闭它”;但Java没有引用所有权的概念,所以你必须自己管理它。如果你打算让myMethod“拥有”这个流,那么在这里关闭它是可以的。 - Andy Turner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接