[英]Input/Output Stream : End of Stream?
我一直想知道:流的結束是什么?
在java.io包中的大多數readLine方法的javadoc中,您可以讀到“如果到達流的末尾,則返回null” - 盡管我從未實際獲得null,因為大多數流(在網絡的情況下)我經常使用的流)只是阻止程序執行,直到將某些內容寫入遠程端的流中
有沒有辦法以實際的非例外投擲方式強制執行這種行為? 我只是好奇......
想想正在閱讀的文件。 那里有一個流的結尾,文件的結尾。 如果你試圖超越它,你就是不能。 如果您有網絡連接,如果您只是等待發送更多數據,則無需成為流的結尾。
在文件的情況下,我們知道沒有更多的數據需要讀取。 在網絡流的情況下,我們(通常)不這樣做。
當沒有更多數據可用時阻止FileReader
,當存在時喚醒:簡單的答案是: 你不能 。 根本區別在於您主動讀取文件,但是當您收聽網絡流時,您會被動地閱讀。 當某些東西來自網絡時,您的硬件會向操作系統發送一個信號,然后操作系統將新數據提供給您的JVM,然后JVM喚醒您的進程以讀取新數據(可以這么說)。 但我們沒有文件,至少不是立即。
一種可能的解決方法是為您擁有的StreamReader
創建一個包裝器,並在更改文件時通知一個偵聽器,然后喚醒您進一步閱讀。 在Java 7中,您可以使用WatchService
。
我從來沒有真正得到一個null,因為大多數流(在我經常使用的網絡流的情況下)只是阻止程序執行,直到某些東西寫入遠程端的流
不會。你從來沒有得到過null,因為對等體從未關閉過連接。 這就是“流的結束”的意思。 這並不意味着“暫時不再有數據”。
在某些時候,套接字將被關閉,並且不能再通過該流發送數據。 這是當InputStream
通過從read()
返回-1及其重載來發出EOF信號時。 這種狀態是不可逆轉的。 那條小溪已經死了。
簡單地阻止開放流上的更多數據不是EOF條件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.