2012-04-01 120 views
1

我無法弄清楚使用I/O。從文件讀取(按位),然後再次寫入文件

我使用這個代碼從文件讀取:

if (file.length() > Integer.MAX_VALUE) { 
    throw new IllegalArgumentException("File is too large: " + file.length()); 
} 

int len = (int) file.length(); 
System.out.println("failo dydis yra = "+len); 
FileInputStream inputStream = new FileInputStream(file); 

try { 
    byte[] fileBits = new byte[len]; 
    for (int pos = 0; pos < len;) { 
     int n = inputStream.read(fileBits, pos, len - pos); 

     if (n < 0) { 
      throw new EOFException(); 
     } 
     pos += n; 

    } 
    for(int q=0; q<len; q++){ 
     char ch = (char)fileBits[q]; 
     int sk = (int)ch; 
     System.out.println("symbol = "+fileBits[q]+" - "+ch+" - "+sk); 
    } 

,當我讀txt文件,然後一切都很好,但是當我讀不txt中,例如圖像我得到類似的結果:

symbol = -78 - ᄇ - 65458 
symbol = 52 - 4 - 52 
symbol = -91 - ᆬ - 65445 
symbol = 80 - P - 80 
symbol = -118 - ハ - 65418 
symbol = 76 - L - 76 
symbol = 122 - z - 122 
symbol = 78 - N - 78 
symbol = 112 - p - 112 
symbol = 97 - a - 97 
symbol = 56 - 8 - 56 
symbol = -112 - ミ - 65424 

所以我想不通爲什麼有減去?爲什麼當我想轉換回我得到這個65 ***。

也許我必須閱讀不同的如果我想轉換這些字節爲字符,與他們合作,再次寫入文件。

謝謝。

+0

嘗試將其封裝在InputStreamReader中。這正確處理字符 – Optimist 2012-04-01 14:15:05

回答

2

所以我不明白爲什麼有減號?

在Java中,a byte can have values between -128 and 127。因此,你看到負面價值。您可以使用0xff & fileBits[q]將其轉換成一個整數值介於0和256

爲什麼當我要轉換回我得到這個65 ***

一個字節轉換成char是除非該字節恰好是ASCII兼容編碼中的一串ASCII字符的一部分,否則無意義。會發生什麼是Java將字節的第一位擴展爲16位值。如果剛剛設置的第一位(即數字是負數),結果將是高16位數,通常採用65xxx的形式。

一切工作正常,只是給圖像處理/顯示功能的字節。請注意,您的函數容易出錯,因爲如果在讀取文件時文件大小發生變化,它將不必要地失敗。如果要讀取字符串,請使用Reader對象,例如InputStreamReader

+0

那麼,如果我需要使用字符,你應該怎麼做? 有沒有辦法可以轉換? – Streetboy 2012-04-01 14:20:47

+0

是的,使用'Reader'。更新了答案。 – phihag 2012-04-01 14:24:03

+0

我怎麼能再次轉換爲字節,如果我使用這個: 0xf&fileBits [q] – Streetboy 2012-04-01 15:06:46

相關問題