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

bot*_*bot 4 java inputstream try-with-resources

像这样:

public void myMethod(InputStream fileIn){
    try (InputStream in = fileIn)  {
        do stuff....
    }
}
Run Code Online (Sandbox Code Playgroud)

它似乎工作.安全吗?

And*_*ner 12

它似乎工作

如果您之前添加InputStream(或某些超类型InputStream),它将会执行in:语言规范要求您为每个资源声明一个变量.

try (InputStream in = fileIn) { ... }
Run Code Online (Sandbox Code Playgroud)

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

try (fileIn) { ... }
Run Code Online (Sandbox Code Playgroud)

并且没有理由它不应该工作:使用变量声明形式,您将为变量分配表达式(新类,方法调用的结果,数组元素等).资源无法看到它是否正在获取"新"实例:它只是具有正确类型值的事物.

这样安全吗?

取决于"安全"究竟是什么意思.

它在某些意义上肯定是安全的,它将在此代码中无错误地工作,并将in.close()在块的末尾调用.

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