2 Stimmen

Lesen von Daten aus einer UTF-8-Textdatei und Tokenisierung

Ich versuche, UTF-8 aus einer Textdatei zu lesen und einige Tokenisierung zu tun, aber ich habe Probleme mit der Codierung:

try {
    fis = new FileInputStream(fName);
} catch (FileNotFoundException ex) {
    //...
}

DataInputStream myInput = new DataInputStream(fis);
    try {
        while (thisLine = myInput.readLine()) != null) {
            StringTokenizer st = new StringTokenizer(thisLine, ";");
            while (st.hasMoreElements()) {
            // do something with st.nextToken();
    }
}
} catch (Exception e) {
//...
}

und DataInputStream hat keine Parameter zum Einstellen der Kodierung!

5voto

Peter Lawrey Punkte 511323

Lassen Sie mich die Javadoc für diese Methode zitieren.

DataInputStream.readLine()

Veraltet. Diese Methode funktioniert nicht konvertiert Bytes nicht richtig t Ab JDK 1.1 ist der bevorzugte Weg zum Textzeilen zu lesen ist über die BufferedReader.readLine() Methode. Programme, die die DataInputStream Klasse zum Lesen von Zeilen verwenden, können konvertiert werden auf die Klasse BufferedReader umgestellt werden, indem durch Ersetzen von Code der Form:

     DataInputStream d = new DataInputStream(in);

mit:

     BufferedReader d
          = new BufferedReader(new InputStreamReader(in));

BTW: JDK 1.1 kam im Februar 1997 heraus, also sollte das für Sie nicht neu sein.

Denken Sie nur daran, wie viel Zeit jeder gespart hätte, wenn Sie die Javadoc gelesen hätten ;)

4voto

Roman Punkte 61632

Sie können InputStreamReader verwenden:

BufferedReader br = new BufferedReader (new InputStreamReader (source, charset);
while (br.readLine () != null) { ... }

Sie können auch Scanner ausprobieren, aber ich bin mir nicht sicher, ob das gut funktioniert.

1voto

Brian Agnew Punkte 260470

Warum nicht InputStreamReader und geben Sie die Kodierung ? Sie können dann mit einer BufferedReader um die readLine()-Fähigkeit bereitzustellen.

0voto

Norbert Hartl Punkte 10085

Wenn Sie Text (und keine Binärdaten) lesen, sollten Sie einen Reader (und keinen InputStream) verwenden. Sie können dann die Kodierung für die vm angeben, indem Sie -Dfile.encoding=utf-8 angeben. Der Reader wird automatisch diese Kodierung verwenden. So können Sie die Kodierung sogar leicht ändern. Sie können BufferedReader auf FileReader verwenden, um eine readLine() zu haben. Die Methode readLine() hat nur beim Lesen von Text eine Bedeutung, ansonsten sind die Zeilenenden nur Bytes

0voto

Jonik Punkte 77106

Ein sehr einfacher Weg:

File myFile = ...

String contents = Files.toString(myFile, Charsets.UTF_8);
for (String token : contents.split(";")) {
    // do something with token
}

Dónde Files y Charsets sind von Guave . Wenn Sie die Datei zeilenweise bearbeiten müssen, beginnen Sie stattdessen mit diesem Beispiel:

List<String> lines = Files.readLines(myFile, Charsets.UTF_8);

Beachten Sie auch, dass split() ist hier einfacher zu verwenden als StringTokenizer .

Die Bibliotheken kennen und nutzen wie ich immer zu sagen pflege. (Natürlich ist das Lesen der gesamten Datei auf einmal nicht für alle Situationen geeignet).

Editar (2013): Ich habe meine Empfehlung von Apache Commons IO zu Guava geändert, das insgesamt eine sauberere und aktiver gepflegte Bibliothek ist.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X