Frage

Ich habe den folgenden Code:

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

Aber die Charaktere erhalten angezeigt bei? 'S. Hat dies etwas mit Java unter Verwendung von Unicode-Zeichen zu tun? Wie kann ich dies korrigieren?

War es hilfreich?

Lösung

Sie müssen wissen, was die Codierung der Datei ist, und dann die ByteBuffer in eine CharBuffer dekodieren, die Codierung. Unter der Annahme, die Datei ist 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();
        }
    }
}

Andere Tipps

buf.getChar () erwartet zwei Bytes pro Zeichen, aber Sie speichern nur 1. Verwenden Sie:

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

Ändern Sie Ihre print-Anweisung an:

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

Es scheint zu helfen.

Je nach Kodierung von somefile.txt kann ein Zeichen, das nicht eigentlich aus zwei Bytes bestehen. Diese Seite weitere Informationen zu erhalten, wie Streams zu lesen mit der richtigen Codierung.

Die Bummer ist, das Dateisystem nicht die Codierung der Datei nicht sagen, weil es nicht weiß. Soweit es betroffen ist, es ist nur ein Haufen von Bytes. Sie müssen entweder einen Weg finden, die Codierung, um das Programm zu kommunizieren, erkennen es irgendwie, oder (wenn möglich) immer darauf, dass die Codierung das gleiche ist (wie UTF-8).

Gibt es einen bestimmten Grund, warum Sie die Datei in der Art und Weise lesen, die Sie tun?

Wenn Sie in einer ASCII-Datei gerade lesen, sollten Sie wirklich einen Reader werden.

ich tun würde es so etwas wie:

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

Und dann entweder readLine oder ähnlich wie in den Daten tatsächlich gelesen!

Ja, es Unicode ist.

Wenn Sie 14 Chars in Ihrer Datei haben, können Sie nur 7 bekommen '?'.

Lösung anhängig. Immer noch denken.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top