Lesen Sie die Ressourcentextdatei in String in Java [closed]

Lesezeit: 7 Minuten

Benutzeravatar von Loc Phan
Loc Phan

Gibt es eine Möglichkeit, eine Textdatei in der Ressource in einen String einzulesen?

Ich nehme an, dies ist eine beliebte Anforderung, aber ich konnte nach dem Googeln kein Dienstprogramm finden.

  • Bitte klären Sie, was Sie mit “Ressourcentextdatei” und “Textdatei in Ressource” meinen – es ist nicht leicht zu verstehen, was Sie erreichen möchten.

    – Matte

    20. Mai 2011 um 6:27 Uhr

  • Das ist nur eine Textdatei unter Classpath wie “classpath*:mytext/text.txt”

    – Lok Phan

    20. Mai 2011 um 6:29 Uhr

  • Seit java11 gibt es dafür eine spezielle Methode: Files.readString(Paths.get(getClass().getResource("foo.txt").toURI()), Charset.forName("utf-8"))

    – Robert

    20. Februar 2021 um 14:57 Uhr

  • LOLz, da bin ich mir ganz sicher alle ist sich absolut sicher, worum es bei dieser Frage geht;-]Einige Leute haben jedoch entschieden, dass sie beweisen müssen, dass sie wichtig sind, und beschlossen, sie als Demonstration ihrer “Macht” geschlossen zu halten;-]Jetzt können neue Antworten mit neuen Java-Funktionen nicht sein hinzugefügt (siehe zum Beispiel Robertos Antwort im Kommentar oben). SO-Community at its best 😉

    – morgwai

    8. Oktober 2021 um 15:31 Uhr


  • @Roberto Ihre Methode funktioniert, wenn ich mein Programm aus einem explodierten Ordner mit Klassen ausführe, aber wenn ich es in JAR packe, Paths.get(...) wirft FileSystemNotFoundException

    – morgwai

    9. Oktober 2021 um 4:56 Uhr


Benutzeravatar von Jon Skeet
Jon Skeet

Ja, Guave bietet dies in der Resources Klasse. Zum Beispiel:

URL url = Resources.getResource("foo.txt");
String text = Resources.toString(url, StandardCharsets.UTF_8);

  • @JonSkeet Das ist großartig, aber für Webanwendungen ist es möglicherweise nicht die beste Lösung, die Implementierung von getResource benutzt Resource.class.getClassLoader aber in Webanwendungen ist dies möglicherweise nicht “Ihr” Klassenlader, daher wird es empfohlen (z [1]) benutzen Thread.currentThread().getContextClassLoader().getResourceAsStream stattdessen (Referenz [1]: stackoverflow.com/questions/676250/…)

    – Eran Medan

    13. Juni 2013 um 20:21 Uhr


  • @EranMedan: Ja, wenn Sie den Kontext-Classloader möchten, möchten Sie ihn explizit verwenden.

    – Jon Skeet

    13. Juni 2013 um 20:24 Uhr

  • In dem besonderen Fall, wenn sich die Ressource neben Ihrer Klasse befindet, können Sie dies tun Resources.toString(MyClass.getResource("foo.txt"), Charsets.UTF_8) was die Verwendung des richtigen Klassenladers garantiert.

    – Bogdan Calmac

    5. März 2015 um 17:46 Uhr

  • com.google.common.io.Resources ist laut SonarQube als instabil gekennzeichnet

    – Ghilteras

    11. Juni 2019 um 1:00 Uhr

  • guava hat die Implementierung geändert. Für Guave 23 sieht die Implementierung wie folgt aus. ClassLoader loader = MoreObjects.firstNonNull( Thread.currentThread().getContextClassLoader(), Resources.class.getClassLoader());

    – xxy

    22. Februar 2020 um 12:18 Uhr


Benutzeravatar von akosicki
akosicki

Sie können die alten verwenden Blöder Scanner-Trick oneliner, um dies ohne zusätzliche Abhängigkeiten wie Guave zu tun:

String text = new Scanner(AppropriateClass.class.getResourceAsStream("foo.txt"), "UTF-8").useDelimiter("\\A").next();

Leute, benutzt keine Sachen von Drittanbietern, es sei denn, ihr braucht das wirklich. Es gibt bereits viele Funktionen im JDK.

  • Die Vermeidung von Drittanbietern ist ein vernünftiges Prinzip. Leider scheint die Kernbibliothek allergisch auf die Modellierung realer Anwendungsfälle zu sein. Schauen Sie sich die Dateien von Java 7 an und sagen Sie mir, warum das Lesen von allem aus einer Klassenpfad-Ressource dort nicht enthalten war? Oder zumindest ein standardisiertes ‘Dateisystem’ verwenden.

    – Dilum Ranatunga

    7. März 2014 um 18:36 Uhr

  • Ist es – oder nicht – notwendig, auch den Stream zu schließen? Guava schließt den Stream intern.

    – Jungfrau47

    12. November 2014 um 13:50 Uhr

  • Hat bei mir auch wunderbar funktioniert! Ich stimme auch dem Drittanbieter-Ding zu: In vielen Antworten scheint die Standardantwort immer zu sein, eine Bibliothek eines Drittanbieters zu verwenden – sei es von Apache oder jemand anderem.

    – Terje Dahl

    5. April 2015 um 8:01 Uhr

  • Rückgeld CartApplication.class.getResourceAsStream zu CartApplication.class.getClassLoader().getResourceAsStream zum Laden von Ressourcen in das aktuelle JAR..wie srm/test/resources

    – Chris DaMour

    27. Februar 2016 um 6:38 Uhr

  • Obwohl ich dies verwendet habe, bin ich völlig anderer Meinung, Pakete von Drittanbietern zu vermeiden. Die Tatsache, dass in Java der einzige Weg, eine Datei einfach in einen String einzulesen, der Scanner-Trick ist, ist ziemlich traurig. Die Alternative zur Verwendung einer Bibliothek eines Drittanbieters besteht darin, dass jeder einfach seine eigenen Wrapper erstellt. Guava for IO gewinnt zweifellos, wenn Sie viele Anforderungen für diese Art von Operation haben. Wo ich zustimme, ist, dass Sie kein Paket eines Drittanbieters importieren sollten, wenn Sie nur eine Stelle in Ihrem Code haben, an der Sie dies tun möchten. Das wäre imo übertrieben.

    – Kenny Cason

    30. März 2016 um 22:21 Uhr

Benutzeravatar von Kovalsky Dmitryi
Kovalsky Dmitryi

Für Java7:

new String(Files.readAllBytes(Paths.get(getClass().getResource("foo.txt").toURI())));

Für Java11:

Files.readString(Paths.get(getClass().getResource("foo.txt").toURI()));

  • Erklären Sie bitte, warum dies funktioniert, warum es besser als andere Alternativen ist und welche Überlegungen zur Leistung/Codierung erforderlich sind.

    – Nanofarad

    17. Oktober 2014 um 10:12 Uhr

  • Es ist Nio 2 in Java 1.7. Es ist ein natives Feature von Java. Verwenden Sie zum Codieren den neuen String (Bytes, StandardCharsets.UTF_8)

    – Kovalsky Dmitryi

    17. Oktober 2014 um 11:29 Uhr


  • in meinem Fall brauchte ich getClass().getClassLoader() aber ansonsten super lösung!

    – Emmanuel Touzéry

    2. Dezember 2016 um 20:02 Uhr

  • Dies funktioniert nicht, sobald die App in einem JAR verpackt ist.

    – Daniel Bo

    9. Oktober 2018 um 14:53 Uhr

Benutzeravatar von Lucio Paiva
Lucio Paiva

Reine und einfache, jar-freundliche Java 8+-Lösung

Diese einfache Methode unten reicht aus, wenn Sie Java 8 oder höher verwenden:

/**
 * Reads given resource file as a string.
 *
 * @param fileName path to the resource file
 * @return the file's contents
 * @throws IOException if read fails for any reason
 */
static String getResourceFileAsString(String fileName) throws IOException {
    ClassLoader classLoader = ClassLoader.getSystemClassLoader();
    try (InputStream is = classLoader.getResourceAsStream(fileName)) {
        if (is == null) return null;
        try (InputStreamReader isr = new InputStreamReader(is);
             BufferedReader reader = new BufferedReader(isr)) {
            return reader.lines().collect(Collectors.joining(System.lineSeparator()));
        }
    }
}

Und es auch arbeitet mit Ressourcen in JAR-Dateien.

Über Textcodierung: InputStreamReader verwendet den Standard-Systemzeichensatz, falls Sie keinen angeben. Möglicherweise möchten Sie es selbst angeben, um Decodierungsprobleme zu vermeiden, wie folgt:

new InputStreamReader(isr, StandardCharsets.UTF_8);

Vermeiden Sie unnötige Abhängigkeiten

Ziehen Sie es immer vor, nicht von großen, fetten Bibliotheken abhängig zu sein. Sofern Sie Guava oder Apache Commons IO nicht bereits für andere Aufgaben verwenden, erscheint das Hinzufügen dieser Bibliotheken zu Ihrem Projekt, nur um aus einer Datei lesen zu können, etwas zu viel.

Benutzeravatar von Luciano Fiandesio
Luciano Fiandesio

Guave hat eine “toString”-Methode zum Einlesen einer Datei in einen String:

import com.google.common.base.Charsets;
import com.google.common.io.Files;

String content = Files.toString(new File("/home/x1/text.log"), Charsets.UTF_8);

Diese Methode erfordert nicht, dass sich die Datei im Klassenpfad befindet (wie in der vorherigen Antwort von Jon Skeet).

  • Oder wenn es sich um einen Eingabestrom handelt, hat Guava auch dafür eine gute Möglichkeit String stringFromStream = CharStreams.toString(new InputStreamReader(resourceAsStream, "UTF-8"));

    – Eran Medan

    13. Juni 2013 um 20:10 Uhr


  • Dies ist in Guava 24.1 veraltet

    – Andrej

    24. April 2018 um 18:54 Uhr

Benutzeravatar der Community
Gemeinschaft

yegor256 hat eine nette Lösung mit Apache Commons IO gefunden:

import org.apache.commons.io.IOUtils;

String text = IOUtils.toString(this.getClass().getResourceAsStream("foo.xml"),
                               "UTF-8");

  • Oder wenn es sich um einen Eingabestrom handelt, hat Guava auch dafür eine gute Möglichkeit String stringFromStream = CharStreams.toString(new InputStreamReader(resourceAsStream, "UTF-8"));

    – Eran Medan

    13. Juni 2013 um 20:10 Uhr


  • Dies ist in Guava 24.1 veraltet

    – Andrej

    24. April 2018 um 18:54 Uhr

Benutzeravatar von Edd
Edd

apache-commons-io hat einen Dienstprogrammnamen FileUtils:

URL url = Resources.getResource("myFile.txt");
File myFile = new File(url.toURI());

String content = FileUtils.readFileToString(myFile, "UTF-8");  // or any other encoding

  • Warum muss man die Kodierung angeben, das verstehe ich nicht. Wenn ich die Datei lese, möchte ich nur, was darin ist, es sollte herausfinden, welche Codierung es ist, wie es mein Editor tut. Wenn ich in Notepad oder ++ öffne, sage ich ihm nicht, welche Codierung es verwenden soll. Ich verwende diese Methode und danach writeStringToFile … aber die Inhalte unterscheiden sich. Ich erhalte seltsame Tokens in der geklonten Datei. Ich verstehe nicht, warum ich eine Kodierung angeben muss.

    – mjs

    20. Dezember 2011 um 14:47 Uhr

  • @Hamidan, die Auswahl der richtigen Codierung ist ein sehr komplexer Algorithmus. Es wird oft in Texteditoren implementiert, aber sie erkennen manchmal nicht die richtige Codierung. Ich würde nicht erwarten, dass eine API zum Lesen von Dateien einen so komplexen Algorithmus zum Lesen meiner Datei einbettet.

    – Vinzenz Robert

    17. Januar 2012 um 11:06 Uhr

  • @SecretService Außerdem verwenden diese Algorithmen Informationen wie die Sprache des Betriebssystems, das Gebietsschema und andere regionale Einstellungen, was bedeutet, dass das Lesen einer Datei ohne Angabe einer Codierung möglicherweise in Ihrem Setup funktioniert, aber nicht in dem einer anderen Person.

    – Feuermurmel

    28. April 2014 um 8:26 Uhr

  • Entschuldigung für das Downvoting, aber ich mag keine Antworten, die trivialen Problemen große Abhängigkeiten hinzufügen.

    – Arne

    1. Juli 2016 um 13:54 Uhr

  • Ich glaube nicht, dass dies funktionieren wird, wenn die Ressource in einem Glas gefunden wird. Dann ist es keine Datei.

    – Ville Oikarinen

    9. Mai 2018 um 9:08 Uhr

1425860cookie-checkLesen Sie die Ressourcentextdatei in String in Java [closed]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy