wake-up-neo.net

Ganze Textdatei zu einem String in Java

Verfügt Java über eine einzeilige Anweisung, in eine Textdatei zu lesen, wie dies bei C # der Fall ist?

Ich meine, gibt es in Java etwas Äquivalentes dazu ?:

String data = System.IO.File.ReadAllText("path to file");

Wenn nicht ... was ist der "optimale Weg", um dies zu tun ...?

Bearbeiten:
Ich bevorzuge eine Möglichkeit innerhalb von Java-Standardbibliotheken ... Ich kann keine Bibliotheken von Drittanbietern verwenden.

51
Betamoo

AFAIK, es gibt keinen Einzeiler mit Standardbibliotheken. Ein typischer Ansatz für Standardbibliotheken wäre etwa so:

public static String readStream(InputStream is) {
    StringBuilder sb = new StringBuilder(512);
    try {
        Reader r = new InputStreamReader(is, "UTF-8");
        int c = 0;
        while ((c = r.read()) != -1) {
            sb.append((char) c);
        }
    } catch (IOException e) {
        throw new RuntimeException(e);
    }
    return sb.toString();
}

Anmerkungen:

  • um Text aus Datei zu lesen, verwenden Sie FileInputStream
  • Wenn Leistung wichtig ist und Sie große Dateien lesen, ist es ratsam, den Stream in BufferedInputStream zu verpacken
  • der Stream sollte vom Anrufer geschlossen werden
20
Neeme Praks

Apache commons-io hat:

String str = FileUtils.readFileToString(file, "utf-8");

In den Standard-Java-Klassen gibt es kein solches Dienstprogramm. Wenn Sie (aus irgendeinem Grund) keine externen Bibliotheken benötigen, müssen Sie sie erneut implementieren. Hier sind einige Beispiele, und alternativ können Sie sehen, wie es von Commons-Io oder Guava implementiert wird.

45
Bozho

Nicht in den Haupt-Java-Bibliotheken, aber Sie können Guava verwenden:

String data = Files.asCharSource(new File("path.txt"), Charsets.UTF_8).read();

Oder um Zeilen zu lesen:

List<String> lines = Files.readLines( new File("path.txt"), Charsets.UTF_8 );

Natürlich bin ich sicher, dass es auch andere Drittanbieter-Bibliotheken gibt, die es ähnlich einfach machen würden - ich bin nur mit Guava bestens vertraut.

25
Jon Skeet

Java 7 verbessert diesen bedauerlichen Zustand mit der Files -Klasse (nicht zu verwechseln mit Guavas -Klasse desselben Namens ). Sie können alle Zeilen einer Datei - ohne externe Bibliotheken - mit erhalten:

List<String> fileLines = Files.readAllLines(path, StandardCharsets.UTF_8);

Oder in einen String:

String contents = new String(Files.readAllBytes(path), StandardCharsets.UTF_8);
// or equivalently:
StandardCharsets.UTF_8.decode(ByteBuffer.wrap(Files.readAllBytes(path)));

Wenn Sie etwas aus der Box mit einem sauberen JDK benötigen, funktioniert dies großartig. Warum schreiben Sie Java ohne Guava?

23
dimo414

In Java 8 (keine externen Bibliotheken) können Sie Streams verwenden. Dieser Code liest eine Datei und fügt alle durch ',' getrennten Zeilen in einen String ein.

try (Stream<String> lines = Files.lines(myPath)) {
    list = lines.collect(Collectors.joining(", "));
} catch (IOException e) {
    LOGGER.error("Failed to load file.", e);
}
9
Kris

Mit JDK/11 können Sie eine vollständige Datei an einer Path als Zeichenfolge mitFiles.readString(Path path)lesen:

try {
    String fileContent = Files.readString(Path.of("/foo/bar/gus"));
} catch (IOException e) {
    // handle exception in i/o
}

die Methodendokumentation aus dem JDK lautet wie folgt:

/**
 * Reads all content from a file into a string, decoding from bytes to characters
 * using the {@link StandardCharsets#UTF_8 UTF-8} {@link Charset charset}.
 * The method ensures that the file is closed when all content have been read
 * or an I/O error, or other runtime exception, is thrown.
 *
 * <p> This method is equivalent to:
 * {@code readString(path, StandardCharsets.UTF_8) }
 *
 * @param   path the path to the file
 *
 * @return  a String containing the content read from the file
 *
 * @throws  IOException
 *          if an I/O error occurs reading from the file or a malformed or
 *          unmappable byte sequence is read
 * @throws  OutOfMemoryError
 *          if the file is extremely large, for example larger than {@code 2GB}
 * @throws  SecurityException
 *          In the case of the default provider, and a security manager is
 *          installed, the {@link SecurityManager#checkRead(String) checkRead}
 *          method is invoked to check read access to the file.
 *
 * @since 11
 */
public static String readString(Path path) throws IOException 
2
nullpointer

Keine externen Bibliotheken erforderlich. Der Inhalt der Datei wird vor der Umwandlung in eine Zeichenfolge zwischengespeichert.

Path path = FileSystems.getDefault().getPath(directory, filename);
String fileContent = new String(Files.readAllBytes(path), StandardCharsets.UTF_8);
1
SzB

Es gibt drei Möglichkeiten, eine Textdatei in einer Zeile zu lesen, ohne dass eine Schleife erforderlich ist. Ich habe 15 Möglichkeiten dokumentiert, aus einer Datei in Java zu lesen und diese stammen aus diesem Artikel. 

Beachten Sie, dass Sie immer noch die zurückgelieferte Liste durchlaufen müssen, obwohl der eigentliche Aufruf zum Lesen des Inhalts der Datei nur eine Zeile ohne Schleifen erfordert.

1) Java.nio.file.Files.readAllLines () - Standardcodierung

import Java.io.File;
import Java.io.IOException;
import Java.nio.file.Files;
import Java.util.List;

public class ReadFile_Files_ReadAllLines {
  public static void main(String [] pArgs) throws IOException {
    String fileName = "c:\\temp\\sample-10KB.txt";
    File file = new File(fileName);

    List  fileLinesList = Files.readAllLines(file.toPath());

    for(String line : fileLinesList) {
      System.out.println(line);
    }
  }
}

2) Java.nio.file.Files.readAllLines () - Explizite Kodierung

import Java.io.File;
import Java.io.IOException;
import Java.nio.charset.StandardCharsets;
import Java.nio.file.Files;
import Java.util.List;

public class ReadFile_Files_ReadAllLines_Encoding {
  public static void main(String [] pArgs) throws IOException {
    String fileName = "c:\\temp\\sample-10KB.txt";
    File file = new File(fileName);

    //use UTF-8 encoding
    List  fileLinesList = Files.readAllLines(file.toPath(), StandardCharsets.UTF_8);

    for(String line : fileLinesList) {
      System.out.println(line);
    }
  }
}

3) Java.nio.file.Files.readAllBytes ()

import Java.io.File;
import Java.io.IOException;
import Java.nio.file.Files;

public class ReadFile_Files_ReadAllBytes {
  public static void main(String [] pArgs) throws IOException {
    String fileName = "c:\\temp\\sample-10KB.txt";
    File file = new File(fileName);

    byte [] fileBytes = Files.readAllBytes(file.toPath());
    char singleChar;
    for(byte b : fileBytes) {
      singleChar = (char) b;
      System.out.print(singleChar);
    }
  }
}
0
gomisha

Nicht ganz ein Liner und wahrscheinlich veraltet, wenn Sie JDK 11 verwenden, wie von nullpointer gepostet. Trotzdem ist es nützlich, wenn Sie einen Eingabedaten ohne Dateieinheiten haben

InputStream inStream = context.getAssets().open(filename);
Scanner s = new Scanner(inStream).useDelimiter("\\A");
String string = s.hasNext() ? s.next() : "";
inStream.close();
return string;
0
mir

Keine externen Bibliotheken erforderlich. Der Inhalt der Datei wird vor der Umwandlung in eine Zeichenfolge zwischengespeichert.

  String fileContent="";
  try {
          File f = new File("path2file");
          byte[] bf = new byte[(int)f.length()];
          new FileInputStream(f).read(bf);
          fileContent = new String(bf, "UTF-8");
      } catch (FileNotFoundException e) {
          // handle file not found exception
      } catch (IOException e) {
          // handle IO-exception
      }
0
SzB