2010-05-07 140 views
4

這FileInputStream.available()的Javadoc說:可能FileInputStream.available愚蠢的我?

返回從該輸入流 可以讀取(或 跳過) 剩餘字節數的估計值,而不受下一個 調用的阻斷一個用於此輸入的方法 流。下一個調用可能是 相同的線程或另一個線程。 A 單個讀取或跳過這個很多字節 不會被阻塞,但可能會讀取或跳過 較少的字節。

在一些情況下,一個非阻塞讀取(或 跳過)可能會被阻塞時,它 僅僅是緩慢的,例如,當讀取 大文件通過慢速 網絡。

我不知道,如果在此檢查:

if (new FileInputStream(xmlFile).available() == 0) 

可我靠的是空文件將始終返回零?

-

感謝@SB,誰不正好回答了這個問題,但第一次給的最佳替代品:

如果XMLFILE是java.io.File的對象, 你可以使用length()方法獲得它的大小 。

回答

2

可以依靠new FileInputStream(fileName).available()如果指定文件爲空則返回零。

不能依靠new FileInputStream(fileName).available() == 0作爲一個明確的測試,該文件是空的。如果fileName是本地文件系統上的常規文件,它可能會工作。但是,如果fileName是設備文件,或者如果它是遠程文件系統上的文件,則available()可能返回零來報告read()必須在一段時間內阻塞。 (或者在遠程文件系統的情況下,它可能不是。)

測試常規文件長度的更可靠的方法是使用new File(fileName).length() == 0。但是對於設備文件或管道,length()調用可能會返回零,而不考慮最終可以讀取的字節數。並且請記住,如果文件不存在,new File(fileName).length()也會返回零。

編輯如果你想有一個可靠的測試,看看如果一個文件是空的,你必須做出一些電話:

public static isEmptyFile(String fileName) { 
    File file = new File(fileName); 
    if (!file.exists()) { 
     return false; 
    } else if (file.length() != 0L) { 
     return false; 
    } else if (file.isFile()) { 
     return true; 
    } else if (file.isDirectory()) { 
     return false; 
    } else { 
     // It may be impossible to tell that a device file/named pipe is 
     // "empty" without actually reading it. This is not a failing of 
     // Java: it is a logical consequence of the way that certain 
     // devices, etc work. 
     throw new CannotAnswerException(...); 
    } 
}   

但是,你會得到很好的建議與各種仔細測試此您運行應用程序的所有平臺上的「文件」類型。某些文件謂詞的行爲被記錄爲特定於平臺;請參閱javadoc

+0

所以我不能依靠length()?沒有可靠的測試? – 2010-05-07 20:17:47

2

我強烈建議不要使用available() - 它可以返回0,因爲流被阻塞,即使仍然有足夠的字節要讀取。它可能不會出現在文件中,但API不保證它不會。

同樣的方法可以用read()方法,雖然可以使用:

if (new FileInputStream(xmlFile).read() == -1) 
    System.out.println("!!File empty!!"); 
2

如果XMLFILE是java.io.File的對象,你可以使用length()方法來獲取它的大小。

+0

@SB - 但是,在零長度文件以外的情況下,File.length()將返回零;看到j​​avadoc。 – 2010-05-08 00:27:51

+0

斯蒂芬 - 好點,但我認爲這是比使用可用的更好的選擇。如果文件是目錄或不存在,可用的功能有哪些?我的猜測是它返回0,但它也可以返回0如果大小大於0. – 2010-05-08 22:59:06

2

我對這個問題的邏輯回答是「我可以依靠空文件總是返回零嗎?」是「是的,對於空文件,available()將返回0」。

但是你可能也想知道「我可以依靠的是只有空文件將返回零?」,和那裏的答案是「不,不規範:available()可能,即使該文件是不返回0空」。

此外,您正在打開一個文件流並且不要再關閉它。這可能導致意想不到的行爲,例如,只要Java程序正在運行,您可能無法移動或刪除文件。如果您的程序在通常運行很長時間的應用程序服務器中運行,這使得文件有效地不可變,這特別令人討厭。