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字符。我知道我在这里缺少一些东西!
答案 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
。