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

Can I use try-with-resources with an InputStream that has already been created?

像这样:

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

这似乎有效。安全吗?

It seems to work

如果您在 in 之前添加 InputStream(或 InputStream 的某些超类型),它会起作用: language spec requires 您要么为每个资源声明一个变量。

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

或者直接参考fileIn,在Java 9+:

try (fileIn) { ... }

而且没有理由不能工作:使用变量声明形式,您正在为变量分配一个表达式(一个新的 class、方法调用的结果、数组元素等).资源看不到它是否正在获取 "new" 实例:它只是具有正确类型值的东西。

is it safe?

取决于您所说的 "safe" 的确切含义。

从某种意义上说,它肯定是安全的,因为它将在此代码中正常工作,并且 in.close() 将在块的末尾被调用。

然而,它违反了"if you didn't open a stream, don't close it"的经验法则。因此,它可能是不安全的,因为它会导致程序的其他部分发生意外故障,这些部分期望流在调用该方法后仍处于打开状态。