2011-11-13 16 views
1

我有一個InputStream被設置爲處理本地文件,但希望添加在以後通過網絡從文件中讀取文件的功能。我認爲InputStream已經適應了這一點。Java:InputStream約定數據可用性,關閉狀態等

我遇到的問題是,顯然InputStream並不保證在任何給定的時間都有數據可用,並且數據可能會在稍後變得可用。不知道我是否正確理解。沒有辦法確定可用數據的絕對大小(如字節數),或者即使InputStream已關閉。似乎如果有一個文件那裏,它必須有一些可用。處理InputStream的方法可能會從中讀取,如果沒有數據可用,則沒有任何理由保留它。更糟的是我什至不知道是否有任何可用的數據。

所以我的問題是,對於通過網絡或本地進行讀取的文件,我如何確定它是否打開/關閉,並且可能確定另一端的文件大小?爲什麼這個班級如此光榮?

+0

我明白這裏的客戶端/服務器動態數據流功能,但對於通過網絡處理文件,這不是處理該數據的好方法 –

回答

3

抽象類InputStream用於從任何來源讀取字節,而不僅僅是文件。其後代爲特定來源提供方法。例如,FileInputStream可用於從文件讀取字節,而SocketInputStream用於從套接字讀取字節。

這就是爲什麼InputStream不提供任何確定文件大小的方法,因爲它對於文件以外的其他來源是沒有意義的。

我不確定通過網絡讀取文件到底是什麼意思。如果這意味着讀取從遠程文件系統(例如通過NFS)的文件,那麼你可以使用length()方法在File類來獲取文件的大小:

File file = new File("/path/to/file"); 
System.out.println(file.length()); 

您可以確定FileInputStream是否打開或者沒有使用上通過調用「的FileInputStream」對象的getFD()方法獲得的FileDescriptor實例valid()方法:

boolean isOpen(FileInputStream stream) 
{ 
    return stream.getFD().valid(); 
} 

當然,要記住的是,Law of Leaky Abstractions適用。

+0

假設我連接到由HTTP服務器託管的文件。該文件已知只是靜態的(沒有動態數據),並且將始終是固定的大小。是否有一個類可以使用從length()和valid()方法中讀取的文件,並且還可以用於本地文件? –

1

java.io.Inputstream做了一件事,只有一件事。它提供了一個從任何東西中讀取數據字節的接口。它可能是一個文件,一個HTPP網站,一個數據庫,無論什麼決定提供InputStream。因此,這完全是因爲簡單性使其具有普遍性。例如,InputStream可用於流式直播電視。在這種情況下,沒有內容的長度,因爲你可以永遠流淌。因此,如果InputStream提供了一段內容特徵,那麼對於無盡的數據流來說,這將變得毫無用處。

當天結束時,您將不得不使用輸入流中的一步技術來確定存在之類的事情。例如,使用File.exists存在文件,爲HTTP不存在尋找404錯誤,或爲數據庫不存在尋找數據庫例外。當你想從文件中讀取字節時,只需要看Inputstream,因爲這就是它所要做的。沒有更多,不少。