2012-10-24 57 views
0

我有一個文件,我的Java應用程序作爲輸入,我一次讀取6個字節。當我從文件系統中讀取它時,一切正常。如果我將所有內容都構建到一個jar中,第一個4868的讀取工作正常,但在此之後它開始以錯誤的順序返回字節數組,並最終在最後讀取更多數據。我得到不同的結果從文件系統和從罐子裏讀取相同的文件

這裏是我的代碼的簡化版本,它再現了問題:

 InputStream inputStream = this.getClass().getResourceAsStream(filePath); 
    byte[] byteArray = new byte[6]; 
    int counter = 0; 
    while ((inputStream.read(byteArray) != -1)) 
    { 
     counter++; 
     System.out.println("Read #" + counter +": " + Arrays.toString(byteArray)); 
    } 
    System.out.println("Done."); 

這是[縮寫]輸出閱讀過的文件系統時,我得到:

... 
Read #4867: [5, 0, 57, 7, 113, -26] 
Read #4868: [2, 0, 62, 7, 114, -26] 
Read #4869: [2, 0, 68, 7, 115, -26] 
Read #4870: [3, 0, 75, 7, 116, -26] 
Read #4871: [2, 0, 83, 7, 117, -26] 
... 
Read #219687: [1, 0, 4, -8, 67, 33] 
Read #219688: [1, 0, 2, -8, 68, 33] 
Read #219689: [5, 0, 1, -8, 67, 33] 
Done. 

這裏是我從罐子裏讀到的東西:

... 
Read #4867: [5, 0, 57, 7, 113, -26] 
Read #4868: [2, 0, 62, 7, 113, -26] //everything is fine up to this point 
Read #4869: [7, 114, -26, 2, 0, 68] 
Read #4870: [7, 115, -26, 3, 0, 75] 
Read #4871: [7, 116, -26, 2, 0, 83] 
... 
Read #219687: [95, 33, 1, 0, 78, -8] 
Read #219688: [94, 33, 1, 0, 76, -8] 
Read #219689: [95, 33, 1, 0, 74, -8] 
... 
Read #219723: [67, 33, 1, 0, 2, -8] 
Read #219724: [68, 33, 5, 0, 1, -8] 
Read #219725: [67, 33, 5, 0, 1, -8] 
Done. 

我解壓縮了jar並確認文件被閱讀的內容是完全相同的,那麼可能會導致讀者返回不同的結果?

+0

我會檢查read()總是返回6.如果你得到一個不同的數字,它不會讀取6個新的字節。 –

回答

2

您的閱讀循環錯誤。 inputStream.read()方法返回字節數確實讀取。在將數據轉換爲字符串之前,必須檢查該數字。

當您從文件讀取時,字節不會全部到達。在你的循環的一次迭代中,你可能讀了4個預期的6個字節,所以你對字符串的轉換不起作用。 如果您正在讀取整數,我建議您使用Scanner或舊的DataInputStream來包裝原始輸入字符串並直接讀取整數。

+0

DataInputStream.readFully()解決了它,謝謝。 –

相關問題