2012-04-28 18 views
5

Estoy usando el siguiente código para leer una subsecuencia de un archivo.Java NIO Issue en 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); 

Sin embargo, esto da salida "str =?" ¿Alguien puede ayudarme por qué está sucediendo esto y cómo resolver esto? Lo siento, soy nuevo en NIO.

Algo adicional, cuando agrego System.out.println (buffer); da salida "java.nio.DirectByteBufferR [pos = 0 lim = 16 cap = 16]".

System.out.println ((char) buffer.get (0)) da salida adecuada significa primer carácter.

+0

Cuál es el contenido de 'abc.txt'? – Jeffrey

+0

@Jeffrey, serie "011000111 ......" de 0/1 bits. – Arpssss

+0

@Jeffrey, cosa adicional cuando agrego System.out.println (buffer) da salida, "java.nio.DirectByteBufferR [pos = 0 lim = 16 cap = 16]" – Arpssss

Respuesta

3

intento con este método, usted tiene un problema de codificación:

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

Gracias. Sin embargo, agrego algunas modificaciones en mi pregunta. ¿Es posible trabajar con el código anterior? En realidad, quiero extraer subtítulos. Creo que el código anterior será menos eficiente. – Arpssss

+0

@Arpssss Estás en modo solo lectura así que supongo que es mejor usar 'asReadOnlyBuffer'. Realicé algunas pruebas en mi computadora con 'asCharBuffer' y solo obtuve 1/2 byte. –

+0

Probé mi código. En realidad, el problema ocurre al hacer "CharBuffer cbuf = buffer.asCharBuffer()". Tal vez algún problema de codificación. – Arpssss