2012-04-28 46 views
5

我正在使用以下代码从文件读取子序列。CharBuffer上的Java NIO问题

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))给出正确的输出表示第一个字符。

+0

什么是'abc.txt'的内容? – Jeffrey 2012-04-28 16:22:09

+0

@Jeffrey,“011000111 ......”系列0/1位。 – Arpssss 2012-04-28 16:23:15

+0

@Jeffrey,额外的东西,当我添加System.out.println(缓冲区)它给出输出,“java.nio.DirectByteBufferR [pos = 0 lim = 16 cap = 16]” – Arpssss 2012-04-28 16:26:36

回答

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); 
+0

谢谢。但是,我在我的问题中添加了一些修改。是否有可能工作上面的代码?实际上,我想提取子字符串。我认为上面的代码会效率不高。 – Arpssss 2012-04-28 16:38:35

+0

@Arpssss你处于只读模式,所以我想最好使用'asReadOnlyBuffer'。我用'asCharBuffer'在我的电脑上做了一些测试,我只得到1/2字节。 – 2012-04-28 16:46:26

+0

我测试了我的代码。事实上,问题发生在做“CharBuffer cbuf = buffer.asCharBuffer()”。也许一些编码问题。 – Arpssss 2012-04-28 17:09:53