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

标签 java inputstream try-with-resources

像这样:

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

这似乎有效。安全吗?

最佳答案

It seems to work

如果您在 in 之前添加 InputStream(或 InputStream 的某些父类(super class)型),它就会执行:language spec requires您要么为每个资源声明一个变量。

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

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

try (fileIn) { ... }

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

is it safe?

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

它肯定是安全的,因为它将在此代码中正常工作,并且 in.close() 将在 block 的末尾被调用。

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

关于java - 我可以对已创建的 InputStream 使用 try-with-resources 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53392971/

相关文章:

java - 为什么用 String 初始化的 InputStream 在 try-with-resources 之外保持打开状态?

java - 在尝试使用之前创建的资源语句中使用资源

java - 正则表达式匹配中的问号不起作用

java - 使用重定向时 Seam 对话突然结束

java - 从 HttpResponse 克隆/多重读取输入流

java - 使用空检查java从套接字读取http请求

android - 使用外部应用程序 android 打开保存在 res/raw 目录中的 pdf 文件

java - Hibernate 中缺少列错误?

java - 将数据发送到 php 脚本并通过 android 保存在 mysql 表中时,加号变为空格

groovy - 如何将 ByteArrayOutput 流写入 groovy 中的文件?