【发布时间】:2012-12-11 20:16:30
【问题描述】:
我正在用 Java 创建一个简单的应用程序,它允许我读取文本文件。我有一个包装在 ByteBuffer 中的字节数组:
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)
感谢回复
【问题讨论】:
-
你到底想做什么?为什么要读取这么低级别的文本文件?你甚至知道你正在阅读的文件的编码吗?
-
如果“#”是
0010 0011,你不应该只检查bArray[i] == 0x0和bArray[i+1] == 0x23吗? Unicode 是两个字节,由于“#”是标准 ASCII 字符集的一部分,它在高字节中没有设置任何位,所以它的表示是0000 0000 0010 0011 -
@jonhopkins 实际上,由于 java 没有二进制表示,所以它应该分别是
0x0和0x23 -
@Jeff 很公平。我刚刚离开提供的示例。我之前没有在 Java 中使用过字节