Das Lesen einer ASCII-Datei mit FileChannel und ByteArrays
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 Zeichen angezeigt bekommen ?'s ist. Hat das etwas zu tun mit Java mit Unicode-Zeichen? Wie kann ich das korrigieren?
InformationsquelleAutor Jake | 2008-09-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie wissen, was die Codierung der Datei ist, und dann decodieren der ByteBuffer in ein CharBuffer mit, Codierung. Vorausgesetzt, die Datei ist ASCII:
buf.flip()
stattbuf.rewind()
, und pass das ganze chbuf zuSystem.out.print()
InformationsquelleAutor jliszka
buf.getChar() erwartet 2 bytes pro Zeichen, aber Sie sind nur die Speicherung von 1. Verwendung:
InformationsquelleAutor Craig Day
Ändern Ihres print-Anweisung:
Scheint zu helfen.
InformationsquelleAutor jjnguy
Je nach Codierung von somefile.txt ein Charakter kann eigentlich nicht sein, aus zwei bytes. Auf dieser Seite gibt mehr Informationen darüber, wie zu Lesen Ströme mit der richtigen Codierung.
Der Mist ist, das Dateisystem nicht sagen, die Codierung der Datei, weil Sie nicht wissen. So weit wie es geht, es ist nur ein Haufen von bytes. Sie müssen entweder einen Weg finden zu kommunizieren, die Kodierung, die das Programm erkennen, das es irgendwie auf, oder (wenn möglich) immer sicherzustellen, dass die Codierung ist die gleiche (wie UTF-8).
InformationsquelleAutor Robert J. Walker
Gibt es einen bestimmten Grund, warum Sie Lesen die Datei in der Weise, dass Sie tun?
Wenn Sie Lesen, die in einer ASCII-Datei, die Sie sollte wirklich sein mit einem Reader.
Ich würde es tun, so etwas wie:
Und verwenden Sie dann entweder
readLine
oder ähnlich tatsächlich Lesen der Daten!in Ihrem Beispiel Sie bytes Lesen und dann decode, um die chars. Warum gehst du davon aus, dass die schneller ist, als mit einem BufferedReader ? Das interessante benchmarks, Sie zeigen bei Lesen nicht die Zeichen.
InformationsquelleAutor
Ja, es ist Unicode.
Wenn Sie haben 14 Zeichen in der Datei, erhalten Sie nur 7 '?'.
Lösung angemeldet. Immer noch denken.
InformationsquelleAutor Burkhard