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.
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:
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.
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.
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?
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);
}
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
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);
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);
}
}
}
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;
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
}