2012-04-28 24 views
5

Tôi đang sử dụng mã sau để đọc một chuỗi phụ từ một tệp.Số phát hành Java NIO trên CharBuffer

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

Tuy nhiên, điều này cho đầu ra "str =?" Ai có thể giúp tôi tại sao điều này xảy ra và làm thế nào để giải quyết vấn đề này? Xin lỗi, tôi mới trong NIO.

Điều bổ sung, khi tôi thêm System.out.println (bộ đệm); nó cho đầu ra "java.nio.DirectByteBufferR [pos = 0 lim = 16 cap = 16]".

System.out.println ((char) buffer.get (0)) cho đầu ra phù hợp nghĩa là ký tự thứ nhất.

+0

nội dung của 'abc.txt' là gì? – Jeffrey

+0

@Jeffrey, "011000111 ......" chuỗi 0/1 bit. – Arpssss

+0

@ Jeffrey, điều bổ sung khi tôi thêm System.out.println (bộ đệm) nó cung cấp cho đầu ra, "java.nio.DirectByteBufferR [pos = 0 lim = 16 cap = 16]" – Arpssss

Trả lời

3

Hãy thử với phương pháp này, bạn có một vấn đề mã hóa:

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

Cảm ơn. Tuy nhiên, tôi thêm một số sửa đổi trong câu hỏi của tôi. Có thể làm việc mã trên không? Trên thực tế, tôi muốn trích xuất các chuỗi con. Tôi nghĩ rằng mã trên sẽ kém hiệu quả hơn. – Arpssss

+0

@Arpssss Bạn đang ở chế độ chỉ đọc vì vậy tôi đoán nó tốt hơn để sử dụng 'asReadOnlyBuffer'. Tôi đã thực hiện một số thử nghiệm trên máy tính của tôi với 'asCharBuffer' tôi chỉ nhận được 1/2 byte. –

+0

Tôi đã kiểm tra mã của mình. Trên thực tế, vấn đề xảy ra trong khi thực hiện "CharBuffer cbuf = buffer.asCharBuffer()". Có thể một số vấn đề về mã hóa. – Arpssss