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

时间:2018-11-20 12:26:13

标签: java inputstream try-with-resources

像这样:

public void myMethod(InputStream fileIn){
    try (InputStream in = fileIn)  {
        do stuff....
    }
}

似乎可行。安全吗?

1 个答案:

答案 0 :(得分:12)

  

似乎可行

如果您在InputStream之前添加InputStream(或in的某些超类型),则将这样做:language spec requires您可以为每个资源声明一个变量。

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

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

try (fileIn) { ... }

并且没有理由不起作用:使用变量声明形式,您可以为变量分配一个表达式(一个新类,一个方法调用的结果,一个数组元素等)。该资源无法看到它是否正在获取“新”实例:它只是具有正确类型值的东西。

  

安全吗?

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

从某种意义上讲,它在此代码中可以正常运行是绝对安全的,in.close()将在代码块的末尾被调用。

但是,它违反了“如果不打开流,就不要关闭流”的经验法则。因此,从某种意义上讲,这可能是不安全的,因为它会导致程序的其他部分发生意外故障,这些故障期望流在调用该方法后仍然可以打开。