繁体   English   中英

为什么声明InputStream.close()会抛出IOException?

[英]Why is InputStream.close() declared to throw IOException?

声明java.io.InputStream.close()方法抛出IOException 在什么情况下会抛出这样的例外?

编辑:是的我已经阅读了javadoc。 任何人都可以比“发生I / O错误时”更具体吗? 关闭InputStream可能发生什么 I / O错误?

在从文件系统读取输入流的情况下,当文件系统本身在关闭期间更新文件上的最后访问时间元数据或一些其他元数据时,可以引发错误。 无论如何,这几乎从未在实践中发生过。

在从网络连接读取输入流的情况下,可以更容易地想到关闭时的错误。 网络套接字的正常关闭实际上涉及通过连接发送的关闭请求(TCP / IP FIN数据包),并等待另一端确认此关闭请求。 (实际上,连接的另一端然后又发送一个闭包请求,结束端确认。)因此,在套接字输入流的情况下,闭包操作实际上涉及通过连接发送流量,因此闭包可以失败并出错。

请注意,在许多实现中,如果流已经关闭, close()通常不会抛出IOException ; 它只是无声无法再次关闭流。

我正在查看Java源代码,并找到了一些有趣的东西,它表明了IOException原因。 InputStream 是一个抽象类 因此,我们无法预测将要关闭的输入类型,因此保持信息流动是有益的。

无论代码使用什么输入流都需要能够抛出IOException ,因为关闭输入流可能会失败。 如果它失败了,那么使用实现的任何东西都需要了解它,因为它很有可能需要处理。

理解Java中Exception结构的布局非常重要。 当然,每个例外都会扩展Exception 但是,还有更广泛的异常类别: java.lang.IOException是其中之一,并涵盖所有可能的输入/输出异常。 当我们说有一个I / O错误时,我们引用任何属于IOException东西。 因此,许多异常扩展了这一个,例如FileNotFoundExceptionEOFException等,因为管理这些异常具有广泛的,总体的例外非常重要。

因此,任何IO类都需要能够在关闭时抛出任何各种IOExceptions。 因此close()必须抛出IOException - 这使得它的实现能够抛出IOException任何扩展。 这就是为什么close()抛出IOException - 继承异常,并且在关闭流时需要能够使用任何IOExceptions。


以下是一些值得注意的情景:

  • 您不能两次关闭IOStream,但如果这样做,通常不会抛出异常
  • 内容变得无法访问(例如,磁盘已卸载)( close()实际上对操作系统至关重要,因为它需要指示文件何时不再忙)
  • 通用源已关闭
  • IOException的所有其他子类未涵盖的任何泛型故障(例如FileNotFoundException

您可以通过运行Exception.getMessage()来检查导致IOException的原因。

必须最终进行底层关闭系统调用,例如在linux http://linux.die.net/man/2/close上 记录该调用与EIO失败:“发生I / O错误。” 原因是,底层文件系统close调用可能会失败。

我自己也很想知道这件事,几年前就这个话题做了一些研究。 这就是我所知道的......

如果你查看你提供的链接中的javadoc,它会清楚地说明“InputStream的close方法什么都不做”,所以它不会抛出异常,对吗? 但是,然后查看IOException的所有子类,您将看到有许多情况,其中inputstream的子类可能无法关闭流。 所以我最好的猜测是这个异常是为子类设计的,以便利用它。

http://docs.oracle.com/javase/6/docs/api/java/io/IOException.html

在某些情况下,它只不过是一种麻烦,而在其他情况下,它清楚地表明出现了问题。 这完全取决于您正在使用的输入流实现类型。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM