2012-12-11 92 views
3

我在Java中創建了一個簡單的應用程序,它允許我讀取文本文件。我有一個字節數組被包裝成字節緩衝區:從字節數組中讀取兩個字節

FileInputStream inputStream = new FileInputStream(name); 
FileChannel channel = inputStream.getChannel(); 
byte[] bArray = new byte[8192]; 
ByteBuffer byteBuffer = ByteBuffer.wrap(bArray); 
int read; 

,然後我用一個while循環都要經過文本文件:

while ((read=channel.read(byteBuffer)) != -1) 
{ 
    for (int i=0; i<read; i++) 
     //my code 
    byteBuffer.clear(); 
} 

我的問題是如何在這個讀一個Unicode字符案件。 Unicode字符由2個字節(16位)組成,所以我認爲bArray [i]保存第一個(更高)8位,隨後的8位是這個字符的第二部分。因此,例如,如果我需要找出這個字符:「#」目前是否在索引i和i + 1上,我可以這樣做嗎? (二進制表示「#」:0010 0011):

if (bArray[i] == (byte)10 && bArray[i+1] == (byte) 11) 

感謝響應

+0

你究竟想要做什麼?你爲什麼要閱讀一個如此低級別的文本文件?你甚至知道你正在閱讀的文件的編碼? –

+1

如果「#」是「0010 0011」,你不應該只是檢查'bArray [i] == 0x0'和'bArray [i + 1] == 0x23'嗎? Unicode是兩個字節,並且由於「#」是標準ASCII字符集的一部分,所以它沒有在高位字節中設置任何位,所以它的表示形式是'0000 0000 0010 0011' – jonhopkins

+1

@jonhopkins實際上,由於java不沒有一個二進制表示,它應該分別是0x0和0x23 – Jeff

回答

6

簡單的回答是,你不應該把文本數據的字節流。具體說就是:不要用ByteBuffer

使用InputStreamReader,它知道如何使用給定的編碼來解釋字節序列。

+1

+1之前,我沒有在Java中使用過字節。如果你想閱讀字符,可以使用一個'Reader'來識別哪個'Charset'用來在字節和字符之間進行轉換。 –

+0

問題是,這種文本文件的閱讀速度必須非常快,如果我在這麼低的級別閱讀該文件,我可以跳過一些字符,並提高效率... – Husky

+0

@赫斯基你有基準的代碼,發現一個'InputStreamReader'太慢了?我嚴重懷疑這將是一個瓶頸。 –