我可以对已创建的 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"的经验法则。因此,它可能是不安全的,因为它会导致程序的其他部分发生意外故障,这些部分期望流在调用该方法后仍处于打开状态。
像这样:
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"的经验法则。因此,它可能是不安全的,因为它会导致程序的其他部分发生意外故障,这些部分期望流在调用该方法后仍处于打开状态。