2014-10-02 63 views
1

我想讀取文件作爲字節數組,並意識到讀取字節的數量取決於使用的方法。這裏的相關代碼:爲什麼getResourceAsStream()和FileInputStream讀取文件返回不同長度的數組?

public byte[] readResource() { 
    try (InputStream is = getClass().getClassLoader().getResourceAsStream(FILE_NAME)) { 
     int available = is.available(); 
     byte[] result = new byte[available]; 
     is.read(result, 0, available); 

     return result; 
    } catch (Exception e) { 
     log.error("Failed to load resource '{}'", FILE_NAME, e); 
    } 

    return new byte[0]; 
} 

public byte[] readFile() { 
    File file = new File(FILE_PATH + FILE_NAME); 
    try (InputStream is = new FileInputStream(file)) { 
     int available = is.available(); 
     byte[] result = new byte[available]; 
     is.read(result, 0, available); 

     return result; 
    } catch (Exception e) { 
     log.error("Failed to load file '{}'", FILE_NAME, e); 
    } 

    return new byte[0]; 
} 

調用File.length(),並用的FileInputStream閱讀返回21566個字節給定的測試文件的正確長度,但讀取文件作爲資源返回21622個字節。

有誰知道爲什麼我得到不同的結果,以及如何解決它,使readResource()返回正確的結果?

+0

也許zthat是不同的文件? – Jens 2014-10-02 06:16:41

+0

你也沒有正確讀取字節。 available()不會返回文件的長度。並且read()不保證讀取要求它讀取的字節數。閱讀Java IO教程,瞭解如何正確讀取流的所有字節。 – 2014-10-02 06:30:38

+0

謝謝!這有幫助。 getResourceAsStream()從目標文件夾中獲取該圖像的舊版本。 – Pakkanen 2014-10-02 06:35:05

回答

3

據的InputStream的所述API docsInputStream.available()不返回資源的大小 - 它返回

,可以從該輸入流中讀取(或跳過)的字節數的估計值無阻塞

要從流中獲取資源的大小,您需要完全讀取流並計算讀取的字節數。

要讀取流作爲一個字節數組返回的內容,你可以做這樣的事情:

try ( InputStream is = getClass().getClassLoader().getResourceAsStream(FILE_NAME); 
      ByteArrayOutputStream bos = new ByteArrayOutputStream()) { 

     byte[] buffer = new byte[4096]; 
     int bytesRead = 0; 
     while ((bytesRead = is.read(buffer)) != -1) { 
      bos.write(buffer, 0, bytesRead); 
     } 
     return bos.toByteArray(); 

    } 
+0

那麼他實際上並不需要資源的大小,他需要它的全部內容。 – EJP 2014-10-02 06:43:41

4

爲什麼的getResourceAsStream(),讀文件,不同長度的FileInputStream返回數組?

因爲你誤用的方式,特別是在Javadoc警告available()方法:

「這是從來沒有正確的使用這個方法的返回值來分配緩衝器旨在保存此流中的所有數據。「

有誰知道爲什麼我得到不同的結果,以及如何解決它,這樣readResource()返回正確的結果?

讀入一個循環,直到流結束。

相關問題