1789 Stimmen

Wie erstelle ich eine Java-Zeichenfolge aus dem Inhalt einer Datei?

Ich verwende das untenstehende Idiom schon seit einiger Zeit. Und es scheint das weit verbreitetste zu sein, zumindest auf den Seiten, die ich besucht habe.

Gibt es einen besseren/anderen Weg, um eine Datei in einen String in Java zu lesen?

private String readFile(String file) throws IOException {
    BufferedReader reader = new BufferedReader(new FileReader (file));
    String line = null;
    StringBuilder stringBuilder = new StringBuilder();
    String ls = System.getProperty("line.separator");

    try {
        while((line = reader.readLine()) != null) {
            stringBuilder.append(line);
            stringBuilder.append(ls);
        }

        return stringBuilder.toString();
    } finally {
        reader.close();
    }
}

8 Stimmen

Kann mir jemand auf eine sehr einfache Weise erklären, was es mit dem NIO auf sich hat? Jedes Mal, wenn ich darüber lese, verliere ich mich in der x-ten Erwähnung eines Kanals :(

8 Stimmen

Bitte beachten Sie, dass nicht garantiert ist, dass der Zeilentrenner in der Datei derselbe ist wie der Zeilentrenner des Systems.

7 Stimmen

Der obige Code hat einen Fehler, bei dem ein zusätzliches Zeilenumbruchzeichen in der letzten Zeile hinzugefügt wird. Es sollte etwas Ähnliches wie folgt sein: if ( (line = reader.readLine()) != null) { stringBuilder.append( line ); } while ( (line = reader.readLine()) != null) { stringBuilder.append( ls ); stringBuilder.append( line ); }

11voto

Saikat Punkte 10782

Verwendung von JDK 8 oder höher:

keine externen Bibliotheken verwendet

Sie können ein neues String-Objekt aus dem Dateiinhalt erstellen (Verwendung von Klassen aus dem Paket java.nio.file):

public String readStringFromFile(String filePath) throws IOException {
    String fileContent = new String(Files.readAllBytes(Paths.get(filePath)));
    return fileContent;
}

0 Stimmen

Duplikat der Antwort von Moritz Petersen, der schrieb: String content = new String(Files.readAllBytes(Paths.get(filename)), "UTF-8");

7voto

Ilya Gazman Punkte 29734

Wenn Sie keinen Zugriff auf die Files-Klasse haben, können Sie eine native Lösung verwenden.

static String readFile(File file, String charset)
        throws IOException
{
    FileInputStream fileInputStream = new FileInputStream(file);
    byte[] buffer = new byte[fileInputStream.available()];
    int length = fileInputStream.read(buffer);
    fileInputStream.close();
    return new String(buffer, 0, length, charset);
}

0 Stimmen

Beispiel Zeichensatz zum Aufrufen?

7voto

Dan Dyer Punkte 52915

Es gibt eine Variante zum gleichen Thema, die eine for-Schleife verwendet, anstelle einer while-Schleife, um den Geltungsbereich der Variablen "line" zu begrenzen. Ob es "besser" ist, ist eine Frage des persönlichen Geschmacks.

for(String line = reader.readLine(); line != null; line = reader.readLine()) {
    stringBuilder.append(line);
    stringBuilder.append(ls);
}

3 Stimmen

Dies ändert die Zeilenumbrüche zur Standardeinstellung. Dies kann erwünscht sein oder auch unbeabsichtigt geschehen.

0 Stimmen

Die Bearbeitung dieser Antwort wurde zurückgesetzt, da der Zweck darin bestand, den Anwendungsbereich der line-Variablen einzugrenzen. Die Bearbeitung hat sie zweimal deklariert, was zu einem Kompilierungsfehler führen würde.

4voto

wau Punkte 820

Eine flexible Lösung mit IOUtils von Apache commons-io in Kombination mit StringWriter:

Reader input = new FileReader();
StringWriter output = new StringWriter();
try {
  IOUtils.copy(input, output);
} finally {
  input.close();
}
String fileContents = output.toString();

Es funktioniert mit jedem Reader oder Input-Stream (nicht nur mit Dateien), zum Beispiel beim Lesen von einer URL.

3voto

Henry Punkte 39

Beachten Sie bei der Verwendung von fileInputStream.available(), dass die zurückgegebene Ganzzahl nicht unbedingt die tatsächliche Dateigröße repräsentiert, sondern vielmehr die geschätzte Menge an Bytes, die das System aus dem Stream lesen können sollte, ohne IO-Blockaden zu verursachen. Eine sichere und einfache Möglichkeit könnte so aussehen

public String readStringFromInputStream(FileInputStream fileInputStream) {
    StringBuffer stringBuffer = new StringBuffer();
    try {
        byte[] buffer;
        while (fileInputStream.available() > 0) {
            buffer = new byte[fileInputStream.available()];
            fileInputStream.read(buffer);
            stringBuffer.append(new String(buffer, "ISO-8859-1"));
        }
    } catch (FileNotFoundException e) {
    } catch (IOException e) { }
    return stringBuffer.toString();
}

Es sollte berücksichtigt werden, dass dieser Ansatz nicht für Multi-Byte-Zeichenkodierungen wie UTF-8 geeignet ist.

1 Stimmen

Dieser Code kann unvorhersehbare Ergebnisse liefern. Gemäß der Dokumentation der Methode available() gibt es keine Garantie dafür, dass das Dateiende erreicht wird, falls die Methode 0 zurückgibt. In diesem Fall könnte es passieren, dass Sie eine unvollständige Datei erhalten. Noch schlimmer ist, dass die tatsächlich gelesene Bytesanzahl kleiner sein kann als der von available() zurückgegebene Wert, wodurch die Ausgabe beschädigt wird.

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