Ich habe versucht, mit java.io.FileReader einige Textdateien zu lesen und in eine Zeichenfolge zu konvertieren, aber ich habe festgestellt, dass das Ergebnis falsch codiert und überhaupt nicht lesbar ist.
Hier ist meine Umgebung:
Windows 2003, Betriebssystemcodierung: CP1252
Java 5.0
Meine Dateien sind UTF-8-codiert oder CP1252-codiert, und einige von ihnen (UTF-8-codierte Dateien) können chinesische (nicht lateinische) Zeichen enthalten.
Ich benutze den folgenden Code, um meine Arbeit zu erledigen:
private static String readFileAsString(String filePath)
throws java.io.IOException{
StringBuffer fileData = new StringBuffer(1000);
FileReader reader = new FileReader(filePath);
//System.out.println(reader.getEncoding());
BufferedReader reader = new BufferedReader(reader);
char[] buf = new char[1024];
int numRead=0;
while((numRead=reader.read(buf)) != -1){
String readData = String.valueOf(buf, 0, numRead);
fileData.append(readData);
buf = new char[1024];
}
reader.close();
return fileData.toString();
}
Der obige Code funktioniert nicht. Ich habe festgestellt, dass die FileReader-Codierung CP1252 ist, auch wenn der Text UTF-8-codiert ist. Aber das JavaDoc von java.io.FileReader sagt Folgendes:
Die Konstruktoren dieser Klasse gehen davon aus, dass die Standardzeichencodierung und die Standardgröße des Bytepuffers angemessen sind.
Bedeutet dies, dass ich die Zeichencodierung nicht selbst festlegen muss, wenn ich FileReader verwende? Aber ich habe derzeit falsch codierte Daten erhalten. Wie gehe ich richtig mit meiner Situation um? Vielen Dank.
Antworten:
Ja, Sie müssen die Codierung der Datei angeben, die Sie lesen möchten.
Ja, dies bedeutet, dass Sie die Codierung der Datei kennen müssen , die Sie lesen möchten.
Nein, es gibt keine allgemeine Möglichkeit, die Codierung einer bestimmten "Nur-Text" -Datei zu erraten .
Die Ein-Argument-Konstruktoren von verwenden
FileReader
immer die Standardcodierung der Plattform, was im Allgemeinen eine schlechte Idee ist .Seit Java 11
FileReader
hat auch Konstruktoren gewonnen, die eine Codierung akzeptieren:new FileReader(file, charset)
undnew FileReader(fileName, charset)
.In früheren Versionen von Java müssen Sie verwenden .
new InputStreamReader(
new FileInputStream(pathToFile)
, <encoding>)
quelle
InputStreamReader
es sich um einejava.io
Klasse handelt.StandardCharsets.UTF_8
, dass es dort keine Möglichkeit gibt, falsch zu tippen"UTF8"
.Byte Order Mark
, zusammen mit .. na ja .. Festlegung der Bytereihenfolge! :) Als solches finde ich es seltsam, dass Javas FileReader UTF-16 mit einer solchen Stückliste nicht automatisch erkennen kann ... Tatsächlich habe ich einmal eine geschriebenUnicodeFileReader
, die genau das tut. Leider Closed Source, aber Google hat seinen UnicodeReader, der sehr ähnlich ist.FileReader
Verwendet die Plattform-Standardcodierung von Java, die von den Systemeinstellungen des Computers abhängt, auf dem sie ausgeführt wird, und ist im Allgemeinen die beliebteste Codierung unter Benutzern in diesem Gebietsschema.Wenn diese "beste Vermutung" nicht korrekt ist, müssen Sie die Codierung explizit angeben. Erlaubt
FileReader
dies leider nicht (große Kontrolle in der API). Stattdessen müssen Sienew InputStreamReader(new FileInputStream(filePath), encoding)
die Codierung aus Metadaten für die Datei verwenden und im Idealfall abrufen.quelle
FileReader
Verwendet die Standardcodierung der Java-Plattform, die von den Systemeinstellungen des Computers abhängt, auf dem sie ausgeführt wird, und im Allgemeinen die beliebteste Codierung unter Benutzern in diesem Gebietsschema ist." Das würde ich nicht sagen. Zumindest von Windows. Aus seltsamen technischen / historischen Gründen ignoriert die JVM die Tatsache, dass Unicode die empfohlene Codierung unter Windows für "alle neuen Anwendungen" ist und verhält sich stattdessen immer so , als ob die als Fallback für Legacy-Apps konfigurierte Legacy-Codierung die "Plattform-Standardeinstellung" ist.Seit Java 11 können Sie Folgendes verwenden:
quelle
Für Java 7+ doc können Sie Folgendes verwenden:
Hier sind alle Charsets doc
Wenn sich Ihre Datei beispielsweise in CP1252 befindet, verwenden Sie diese Methode
Hier finden Sie weitere kanonische Namen für Java-Codierungen für IO- und NIO- Dokumente
Wenn Sie nicht wissen , mit genau codiert , in einer Datei erhalten haben, können Sie einige Drittanbieter - Libs wie dieses Tool von Google verwenden diese , die recht ordentlich funktioniert.
quelle
FileInputStream mit InputStreamReader ist besser als die direkte Verwendung von FileReader, da Sie mit letzterem keinen Codierungszeichensatz angeben können.
Hier ist ein Beispiel für die gemeinsame Verwendung von BufferedReader, FileInputStream und InputStreamReader, damit Sie Zeilen aus einer Datei lesen können.
quelle
Für eine andere als lateinische Sprache, zum Beispiel Kyrillisch, können Sie Folgendes verwenden:
und stellen Sie sicher, dass Ihre
.txt
Datei imUTF-8
(aber nicht als StandardANSI
) Format gespeichert ist. Prost!quelle