簡體   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