2012-04-28 47 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