2012-12-11 94 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'太慢了?我严重怀疑这将是一个瓶颈。 –