Java 我是否可以对已创建的InputStream使用try with资源?

Java 我是否可以对已创建的InputStream使用try with资源?,java,inputstream,try-with-resources,Java,Inputstream,Try With Resources,像这样: public void myMethod(InputStream fileIn){ try (InputStream in = fileIn) { do stuff.... } } 它似乎起作用了。安全吗 它似乎起作用了 如果在中的之前添加InputStream(或InputStream的某个超类型),就可以了:您可以为每个资源声明一个变量 try (InputStream in = fileIn) { ... } 或者直接参考Java 9+中的f

像这样:

public void myMethod(InputStream fileIn){
    try (InputStream in = fileIn)  {
        do stuff....
    }
}
它似乎起作用了。安全吗

它似乎起作用了

如果在中的
之前添加
InputStream
(或
InputStream
的某个超类型),就可以了:您可以为每个资源声明一个变量

try (InputStream in = fileIn) { ... }
或者直接参考Java 9+中的
fileIn

try (fileIn) { ... }
没有理由认为它不应该工作:使用变量声明表单,您正在为变量分配一个表达式(一个新类、方法调用的结果、数组元素等)。资源无法看到它是否正在获得一个“新”实例:它只是一个具有正确类型值的对象

安全吗

这取决于你所说的“安全”到底是什么意思

从这个意义上讲,它肯定是安全的,因为它在该代码中不会出错,并且在.close()中的
in
将在块的末尾被调用


然而,它违反了“如果你没有打开一个流,就不要关闭它”的经验法则。因此,它可能是不安全的,因为它会导致程序的其他部分出现意外故障,这些部分希望调用该方法后流仍然打开。

谢谢!是的,这是我的一个输入错误,我确实有
try(InputStream in=fileIn)
我已经解决了这个问题,也许我需要重新考虑我在打开/关闭流方面的策略。再次感谢!这只是一条经验法则;没有什么可以说的,你需要遵循它。更一般的形式是“如果你没有一条流,就不要关闭它”;但是Java不知道引用的所有权,所以您必须自己管理它。如果您打算让
myMethod
获得流的“所有权”,可以在这里关闭它。