Java:FileChannel MappedByteBuffer为UTF8

时间:2013-11-13 10:51:38

标签: java

file = new RandomAccessFile(filename, "rw");
channel = file.getChannel();
MappedByteBuffer buffer = channel.map(FileChannel.MapMode.READ_ONLY, 0, channel.size());
buffer.load();  
for (int i = 0; i < buffer.limit(); i++)
{
       System.out.print((char) buffer.getChar());
}

然而,这会吐出非UTF8字符。我知道我在这里缺少一些东西!

1 个答案:

答案 0 :(得分:2)

首先,这里的术语存在一些混淆(我认为)。 Java字符是UTF-16而不是UTF-8。您不会期望char中看到UTF-8字符。 (实际上,UTF-8使用1到5 bytes来编码单个Unicode代码点。在许多情况下,字符的UTF-8编码不适合char .. 。)

这种术语混淆意味着我无法确定你实际上想要做什么,或者你实际看到的是什么。所以我要猜测您实际上正在尝试读取一个文件(您认为)以UTF-8编码...或者可能采用ASCII或ASCII等7或8位编码Latin-1的。

在这种情况下,主要问题是getChar()方法没有达到预期效果。

您的代码似乎假设getChar将以某种方式处理解码 来自缓冲区中字节的“下一个字符”。实际上,它的作用是在缓冲区中接下来的两个字节......它们是什么......将它们组合起来(使用逐位'shift'和'或')并将它们作为{{返回} 1}}。结果与原始文件中的字符没有太大的相似之处。实际上,您可能会得到一个随机的Unicode字符序列,偶尔会出现“无法打印”的内容,甚至是非法的。 (某些char值保留在中,并且要么不能使用,要么必须以正确的顺序使用。)

第二个问题是你的循环将尝试“读取”比缓冲区中更多的字符。 char方法返回字节数,而不是字符数。

我的建议与EJP基本相同。对于文字,请使用limit()CharBuffer