2015-11-11 76 views
3

讓我們假設我有一個有效的Java FileDescriptor這是我在這樣得到:有沒有辦法讓文件大小隻有FileDescriptor?

FileInputStream is = new FileInputStream("/some/path/to/file.txt"); 
FileDescriptor fd = is.getFD(); 

現在請忘記我知道文件的路徑。我唯一擁有的是FileDescriptor。有沒有簡單的方法知道文件的大小? 現在我已經檢查了:

  1. FileDescriptorvalid()方法,可以告訴我,如果它是有效的 但沒有length()size()功能。
  2. FileInputStream不返回的路徑和因爲它是一個流它 顯然不會告訴我的文件大小。
  3. Filehttp://docs.oracle.com/javase/7/docs/api/java/io/File.html) 其中length()方法沒有能夠處理的構造函數 FileDescriptor。

我知道我可以讀取整個流並總結長度,但我不認爲它是簡單的方法

+1

您是否嘗試過inputStream.available()? – Stefan

+2

否因爲API(http://docs.oracle.com/javase/7/docs/api/java/io/InputStream.html#available%28%29)指出函數返回:字節數的估計值即可以從這個輸入流中讀取(或跳過)而不阻塞,或者當它到達輸入流的末尾時讀取(或跳過)。 – user1723095

+0

@Stefan它會可靠嗎?這是一個估計,只涵蓋非阻塞。我想在一個文件上它可能是好的,但我不認爲有任何保證。 –

回答

4

一個簡單的辦法是讓FileChannelrefer to this question)的大小:

public long getSize(FileDescriptor fd) throws IOException { 
    try (FileInputStream fis = new FileInputStream(fd)) { 
     return fis.getChannel().size(); 
    } 
} 

然而,作爲所述鏈接的問題,也沒有強有力的保證,這將爲所有OS工作。

唯一可靠和兼容的方式是讀取流的內容,就像你在你的問題說。

+0

一個普遍的問題:使用'getChannel()。size()'和'available()'有什麼區別? – nafas

+1

@nafas我認爲[這個答案](http://stackoverflow.com/a/23147743/1743880)覆蓋它。 – Tunaki

+0

感謝它在我的情況。順便說一句。你有沒有看到爲什麼File沒有能夠處理FileDescriptor的構造函數? – user1723095

相關問題