Mein Projekt hat folgende Struktur:
/src/main/java/
/src/main/resources/
/src/test/java/
/src/test/resources/
Ich habe eine Datei in /src/test/resources/test.csv
und möchte die Datei von einem Unit-Test in laden/src/test/java/MyTest.java
Ich habe diesen Code, der nicht funktioniert hat. Es beschwert sich "Keine solche Datei oder Verzeichnis".
BufferedReader br = new BufferedReader (new FileReader(test.csv))
Ich habe es auch versucht
InputStream is = (InputStream) MyTest.class.getResourcesAsStream(test.csv))
Das funktioniert auch nicht. Es kehrt zurück null
. Ich benutze Maven, um mein Projekt zu erstellen.
this.getClass().getResource("/test.csv")
Antworten:
Versuchen Sie das nächste:
Wenn das oben genannte nicht funktioniert, wurden verschiedene Projekte der folgenden Klasse hinzugefügt: 1 (Code hier ). 2
ClassLoaderUtil
Hier einige Beispiele für die Verwendung dieser Klasse:
Anmerkungen
quelle
Object.class.getClassLoader();
aus einem statischen Kontext, der nicht funktioniert hat - dieser Vorschlag funktioniert - nun, fast, er spritzt%20
für Leerzeichen, die mir einenFileNotFoundException
Versuchen:
IIRC ist
getResourceAsStream()
standardmäßig relativ zum Paket der Klasse.Wie @Terran bemerkt hat, vergessen Sie nicht, das
/
am Anfang des Dateinamens hinzuzufügenquelle
String
stackoverflow.com/a/35446009/544045Hier ist eine schnelle Lösung mit Guava :
Verwendung:
quelle
Probieren Sie Flowing Codes für das Spring-Projekt aus
Oder bei einem Projekt außerhalb des Frühlings
quelle
Nicht-Frühlingsprojekt:
Für Frühjahrsprojekte können Sie auch einen Zeilencode verwenden, um eine beliebige Datei im Ressourcenordner abzurufen:
quelle
Jetzt illustriere ich den Quellcode zum Lesen einer Schriftart aus einem von Maven erstellten Ressourcenverzeichnis.
Es hat bei mir funktioniert und ich hoffe, dass der gesamte Quellcode Ihnen auch hilft. Viel Spaß!
quelle
Für Java nach 1.7
quelle
Wenn Sie den Kontext ClassLoader verwenden, um eine Ressource zu finden, kostet dies definitiv die Anwendungsleistung.
quelle
Importieren Sie Folgendes:
Die folgende Methode gibt eine Datei in einer ArrayList of Strings zurück:
quelle
Ich stand vor dem gleichen Problem .
Die Datei wurde von einem Klassenladeprogramm nicht gefunden, was bedeutet, dass sie nicht in das Artefakt (jar) gepackt wurde. Sie müssen das Projekt erstellen . Zum Beispiel mit maven:
Die Dateien, die Sie dem Ressourcenordner hinzugefügt haben, werden in den Maven-Build übernommen und stehen der Anwendung zur Verfügung.
Ich möchte meine Antwort behalten: Es erklärt nicht, wie man eine Datei liest (andere Antworten erklären das), es antwortet, warum
InputStream
oderresource
war null . Eine ähnliche Antwort gibt es hier .quelle
getResource () funktionierte einwandfrei mit den
src/main/resources
nur darin abgelegten Ressourcendateien . Um eine Datei zu erhalten, die sich auf einem anderen Pfad als dem angegebenen befindetsrc/main/resources
, müssensrc/test/java
Sie sie explizit erstellen.Das folgende Beispiel kann Ihnen helfen
quelle
Funktioniert der Code, wenn das Maven-Build-JAR nicht ausgeführt wird, z. B. wenn es von Ihrer IDE ausgeführt wird? Wenn ja, stellen Sie sicher, dass die Datei tatsächlich im JAR enthalten ist. Der Ressourcenordner sollte in der POM-Datei enthalten sein
<build><resources>
.quelle
Die folgende Klasse kann verwendet werden, um eine
resource
von der zu ladenclasspath
und eine passende Fehlermeldung zu erhalten, falls ein Problem mit der angegebenen Klasse vorliegtfilePath
.quelle
Ich habe dieses Problem gelöst, indem ich
/scr/main/resources
meinem Ordner einen Ordner hinzugefügt habeJava Build Path
quelle
Ich habe es sowohl auf Running Jar als auch in IDE zum Laufen gebracht, indem ich als geschrieben habe
quelle
quelle
Sie können com.google.common.io.Resources.getResource verwenden, um die URL der Datei zu lesen, und dann den Dateiinhalt mit java.nio.file.Files abrufen, um den Inhalt der Datei zu lesen.
quelle
Ich lasse es funktionieren, ohne auf "class" oder "ClassLoader" zu verweisen.
Angenommen, wir haben drei Szenarien mit dem Speicherort der Datei 'example.file' und Ihrem Arbeitsverzeichnis (in dem Ihre App ausgeführt wird) ist home / mydocuments / program / projects / myapp:
a) Ein Unterordner des Arbeitsverzeichnisses: myapp / res / files / example.file
b) Ein Unterordner, der nicht vom Arbeitsverzeichnis abstammt: projects / files / example.file
b2) Ein weiterer Unterordner, der nicht vom Arbeitsverzeichnis abstammt: program / files / example.file
c) Ein Stammordner: home / mydocuments / files / example.file (Linux; unter Windows ersetzen Sie home / durch C :)
1) Holen Sie sich den richtigen Weg: a)
String path = "res/files/example.file";
b)String path = "../projects/files/example.file"
b2)String path = "../../program/files/example.file"
c)String path = "/home/mydocuments/files/example.file"
Wenn es sich um einen Stammordner handelt, beginnen Sie den Pfadnamen grundsätzlich mit einem führenden Schrägstrich. Wenn es sich um einen Unterordner handelt, darf vor dem Pfadnamen kein Schrägstrich stehen. Wenn der Unterordner nicht vom Arbeitsverzeichnis abstammt, müssen Sie ihn mit "../" aufrufen. Dies weist das System an, einen Ordner nach oben zu verschieben.
2) Erstellen Sie ein Dateiobjekt, indem Sie den richtigen Pfad übergeben:
3) Sie können jetzt loslegen:
quelle