Java NIO 中 CharBuffer 的问题

5
我正在使用以下代码从文件中读取一个子序列:

FileChannel channel = new RandomAccessFile("abc.txt", "r").getChannel();
ByteBuffer buffer = channel.map(FileChannel.MapMode.READ_ONLY, 0, channel.size());
CharBuffer cbuf = buffer.asCharBuffer();

String str = cbuf.subSequence(0, 1).toString();
System.out.println("str = " + str);

然而,这会输出"str = ?"。有人能帮我解释一下为什么会出现这种情况以及如何解决吗?很抱歉,我对NIO还不熟悉。

另外,当我添加System.out.println(buffer)时,它会输出"java.nio.DirectByteBufferR[pos=0 lim=16 cap=16]"。

System.out.println((char)buffer.get(0))会输出正确的结果,即第一个字符。


abc.txt 的内容是什么? - Jeffrey
@Jeffrey,“011000111......”一系列的0/1位。 - Arpssss
@Jeffrey,另外当我添加System.out.println(buffer)时,它会输出“java.nio.DirectByteBufferR[pos=0 lim=16 cap=16]”。 - Arpssss
文件是否可能采用某种Unicode编码? - Attila
你描述这个文件的方式好像它是一个二进制文件而不是文本文件。如果是这样,你真的不想尝试将其读取为文本文件。 - Hovercraft Full Of Eels
显示剩余3条评论
1个回答

3

尝试使用该方法,您可能会遇到编码问题:

    FileChannel channel = new RandomAccessFile("/home/alain/Bureau/clair.txt", "r").getChannel();
    ByteBuffer buffer = channel.map(FileChannel.MapMode.READ_ONLY, 0, channel.size());
    Charset chars = Charset.forName("ISO-8859-1");
    CharBuffer cbuf = chars.decode(buffer);
    String str = cbuf.subSequence(0, 10).toString();
    System.out.println("str = " + str);

谢谢。不过,我在我的问题中添加了一些修改。以上代码是否可行?实际上,我想提取子字符串。我认为以上代码效率较低。 - Arpssss
@Arpssss,你现在处于只读模式,所以最好使用asReadOnlyBuffer。我在我的电脑上进行了一些测试,使用asCharBuffer只能得到1/2个字节。 - alain.janinm
我测试了我的代码。实际上,问题出在执行“CharBuffer cbuf = buffer.asCharBuffer()”时。可能是某些编码问题。 - Arpssss
是的,我正在查看它,请检查这个解决方案。 ;) - alain.janinm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接