Pregunta

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?¿Tiene esto algo que ver con que Java use caracteres Unicode?¿Cómo corrijo esto?

¿Fue útil?

Solución

Debe saber cuál es la codificación del archivo y luego decodificar ByteBuffer en un CharBuffer usando esa codificación.Suponiendo que el archivo sea 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();
        }
    }
}

Otros consejos

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

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

Cambiando su estado de cuenta impreso a:

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

Parece ayudar.

Dependiendo de la codificación de somefile.txt, es posible que un carácter no esté compuesto de dos bytes. Esta página brinda más información sobre cómo leer transmisiones 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 a él respecta, son solo un montón de bytes.Debe encontrar alguna manera de comunicar la codificación al programa, detectarla de alguna manera o (si es posible) asegurarse siempre de que la codificación sea la misma (como UTF-8).

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

Si está leyendo un archivo ASCII, debería utilizar un lector.

Yo lo haría algo como:

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

Y luego usa cualquiera de los dos readLine o similar para leer realmente los datos!

Sí, es Unicode.

Si tiene 14 caracteres en su archivo, solo obtendrá 7 '?'.

Solución pendiente.Sigue pensando.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top