2012-04-28 9 views
5

Sto usando il seguente codice per leggere una sottodivisione da un file.Problema Java NIO su 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); 

Tuttavia, questo produce "str =?" Qualcuno può aiutarmi perché sta succedendo questo e come risolverlo? Scusa, sono nuovo in NIO.

Ulteriore cosa, quando aggiungo System.out.println (buffer); fornisce l'output "java.nio.DirectByteBufferR [pos = 0 lim = 16 cap = 16]".

System.out.println ((char) buffer.get (0)) fornisce un'uscita corretta significa 1 ° carattere.

+0

Qual è il contenuto di 'abc.txt'? – Jeffrey

+0

@Jeffrey, serie "011000111 ......" di bit 0/1. – Arpssss

+0

@Jeffrey, cosa aggiuntiva quando aggiungo System.out.println (buffer) fornisce output, "java.nio.DirectByteBufferR [pos = 0 lim = 16 cap = 16]" – Arpssss

risposta

3

prova con questo metodo, si dispone di un problema di codifica:

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

Grazie. Tuttavia, aggiungo qualche modifica alla mia domanda. È possibile lavorare con il codice sopra? In realtà, voglio estrarre sotto-stringhe. Penso che il codice sopra sarà meno efficiente. – Arpssss

+0

@Arpssss Sei in modalità di sola lettura, quindi suppongo che sia meglio usare 'asReadOnlyBuffer'. Ho fatto dei test sul mio computer con 'asCharBuffer'. Ho solo 1/2 byte. –

+0

Ho testato il mio codice. In realtà, il problema si verifica mentre si esegue "CharBuffer cbuf = buffer.asCharBuffer()". Forse qualche problema di codifica. – Arpssss