InputStream.close() 是java中的阻塞调用吗?

Posted

技术标签:

【中文标题】InputStream.close() 是java中的阻塞调用吗?【英文标题】:Is InputStream.close() a blocking call in java? 【发布时间】:2012-11-27 13:40:41 【问题描述】:

我从输入流中读取数据,并在 finally 块中尝试通过调用 in.close(); 来关闭它; 但是 main 的执行被阻止了。出路是什么?

根据建议,我使用的代码是,

if (!processed) 
                System.out.println("in processed");
                byte[] contents = new byte[(int) fileSplit.getLength()];
                Path file = fileSplit.getPath();
                FileSystem fs = file.getFileSystem(conf);
                FSDataInputStream in = null;
                try 
                    in = fs.open(file);
                    IOUtils.readFully(in, contents, 0, contents.length);

                    value.set(contents, 0, contents.length);
                 finally 
                    System.out.println("before close stream");
                    IOUtils.closeStream(in);
                
                processed = true;
                return true;
            
            System.out.println("out of processed");
            return false;
        

【问题讨论】:

不显示其他人无法轻易展示的源代码。 @AdityaJain @ ILLA:完成:) 是控制台上的“关闭流之前”打印 类似帖子..***.com/questions/646940/… @BhavikShah : 是的..我把那个打印出来了.. 【参考方案1】:

java.io.InputStream.close 没有阻塞,至少 API 从来没有这么说。比较 InputStream.read

 Reads the next byte of data from the input stream. The value byte is
 returned as an <code>int</code> in the range <code>0</code> to
 <code>255</code>. If no byte is available because the end of the stream
 has been reached, the value <code>-1</code> is returned. This method
 blocks until input data is available, the end of the stream is detected,
 or an exception is thrown.

和 InputStream.close

  Closes this file input stream and releases any system resources
  associated with the stream.

至于解决您的问题,我建议使用 Java 7 Files.readAllBytes 并忘记您的难题。

【讨论】:

不能使用 Files.readAllBytes,因为这是架构的一部分,需要通过定义开始和结束位置并进入缓冲区来完成读取。 所有流上的 I/O 阻塞。

以上是关于InputStream.close() 是java中的阻塞调用吗?的主要内容,如果未能解决你的问题,请参考以下文章

Byteman JUnit Runner - 无法在自动关闭的 InputStream#close 上触发 IOException

如何防止从 close_wait 连接打开太多文件

文件上传端点需要关闭InputStream吗?

Android-Android下怎么遍历assets录下的子文件夹

java是啥?

Java_核心基础概念