read into files create array java file-io io bytearray filechannel

java - into - Lectura de un archivo ASCII con FileChannel y ByteArrays



read binary files in java (6)

¿Hay alguna razón en particular por la que estás leyendo el archivo de la forma en que lo haces?

Si estás leyendo en un archivo ASCII, realmente deberías estar usando un Reader.

Lo haría algo así como:

File inputFile = new File("somefile.txt"); BufferedReader reader = new BufferedReader(new FileReader(inputFile));

¡Y luego use readLine o similar para leer los datos!

Tengo el siguiente código:

String inputFile = "somefile.txt"; FileInputStream in = new FileInputStream(inputFile); FileChannel ch = in.getChannel(); ByteBuffer buf = ByteBuffer.allocateDirect(BUFSIZE); // BUFSIZE = 256 /* read the file into a buffer, 256 bytes at a time */ int rd; while ( (rd = ch.read( buf )) != -1 ) { buf.rewind(); for ( int i = 0; i < rd/2; i++ ) { /* print each character */ System.out.print(buf.getChar()); } buf.clear(); }

Pero los personajes se muestran en? ''S. ¿Tiene esto algo que ver con Java usando caracteres Unicode? ¿Cómo puedo corregir esto?


Cambiando su extracto de impresión a:

System.out.print((char)buf.get());

Parece ayudar.


Debes saber cuál es la codificación del archivo y luego decodificar el ByteBuffer en un CharBuffer utilizando esa codificación. Suponiendo que el archivo es ASCII:

import java.util.*; import java.io.*; import java.nio.*; import java.nio.channels.*; import java.nio.charset.*; public class Buffer { public static void main(String args[]) throws Exception { String inputFile = "somefile"; FileInputStream in = new FileInputStream(inputFile); FileChannel ch = in.getChannel(); ByteBuffer buf = ByteBuffer.allocateDirect(BUFSIZE); // BUFSIZE = 256 Charset cs = Charset.forName("ASCII"); // Or whatever encoding you want /* read the file into a buffer, 256 bytes at a time */ int rd; while ( (rd = ch.read( buf )) != -1 ) { buf.rewind(); CharBuffer chbuf = cs.decode(buf); for ( int i = 0; i < chbuf.length(); i++ ) { /* print each character */ System.out.print(chbuf.get()); } buf.clear(); } } }


Dependiendo de la codificación de somefile.txt, un personaje puede no estar compuesto de dos bytes. Esta página proporciona más información sobre cómo leer secuencias con la codificación adecuada.

Lo malo es que el sistema de archivos no le dice la codificación del archivo porque no lo sabe. En lo que se refiere, es solo un montón de bytes. Debe encontrar alguna forma de comunicar la codificación al programa, detectarlo de algún modo o (si es posible) siempre asegurarse de que la codificación sea la misma (como UTF-8).


Sí, es Unicode.

Si tiene 14 Caracteres en su Archivo, solo obtiene 7 ''?''.

Solución pendiente. Sigue pensando.


buf.getChar () espera 2 bytes por carácter pero solo está almacenando 1. Utilice:

System.out.print((char) buf.get());