2013-06-25 30 views
0

我的字節數組輸出在輸出中顯示未使用的位(默認)值爲0。
如何從結果中刪除它們?如何從字節數組中刪除默認位

byte[] data=new byte[20]; 
int cl; 
try { 
    FileInputStream fs = new FileInputStream("c:/abc.txt"); 

    ByteArrayOutputStream os = new ByteArrayOutputStream(); 
    while ((cl = fs.read(data,0,data.length)) != -1) 
     os.write(data,0,cl); 
    os.flush(); 
} 

System.out.println(Arrays.toString(data)); 

這裏是從我的代碼輸出:

[104, 105, 32, 119, 101, 108, 99, 111, 109, 101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 

回答

0

你確定你不是這個意思嗎?

//... 
System.out.println(Arrays.toString(os.toByteArray())); 

您正在打印用於以字節塊的形式從文件檢索數據的臨時數組的內容。通過調用字節數組流的toByteArray方法(請參閱ByteArrayOutputStream#toByteArray),您可以獲得預先設定的結果,該結果是具有適當數組大小的文件的全部內容。

在一個較小的問題中,您在數據數組中找到的零是在數組創建時定義的那些零。它們沒有被覆蓋,因爲文件大小不足以將所有索引至少寫入一次。至b [OFF]和元素B [關+ LEN]至b [b.length個-1]不受影響[0]

在每一個情況下,b:從InputStream#read引用。

+0

@Dukeling那不會產生相同的結果。 'ByteArrayOutputStream#toString'將緩衝區的內容轉換爲字符串解碼字節。在這種情況下,我假設我們只是想查看文件的二進制內容。 –

+0

@Dukeling所需要的只是快速瀏覽文檔。 ;) –

+0

謝謝噸...我欠你一杯啤酒:) –

0

如果只有二十字節都被寫入。

if ((cl = fs.read(data,0,data.length)) != -1) { 
     while (cl > 1 && data[cl - 1] == 0) 
      --cl; 
     os.write(data,0,cl); 
    } 

雖然看起來該文件是一個文本文件,並用二進制零寫入。 如果您確定總是寫入20個字節的數組,並且尾部字節全部爲0,則可以將第一個if再次變成while

+1

「cl」已經是所需的長度。如果是這樣,問題出在'Arrays.toString(data)'。 – Dukeling

+0

+1啞啞啞。讓我們在while循環中打印('{}'不要忘記),並打印'cl'。 'Arrays.toString(Array.copyOfRange(data,0,cl))' –