Es ist eine Erinnerung, weil ich eine Weile gebraucht habe, um die Dateien in src / main / resources
in Java zu lesen.
src/main/resources/sample1.txt
sample1
src/main/java/Foo.java
public void sample1() {
String path = "src/main/resources/sample1.txt";
try (BufferedReader br = Files.newBufferedReader(Paths.get(path))) {
System.out.println(br.readLine());
} catch (IOException e) {
e.printStackTrace();
}
}
Ausführungsergebnis
sample1
src/main/resources/sample2.txt
sample2
src/main/java/Foo.java
public void sample2() {
String path = "/sample2.txt";
//Foo für statische Methoden.class.Schreiben Sie wie getResourceAsStream(Foo ist der Klassenname)
try (InputStream is = getClass().getResourceAsStream(path);
BufferedReader br = new BufferedReader(new InputStreamReader(is))) {
System.out.println(br.readLine());
} catch (IOException e) {
e.printStackTrace();
}
}
Ausführungsergebnis
sample2
In 1 und 2 ist das Verhalten beim Testen unterschiedlich, wenn eine Datei mit demselben Namen in "src / test / resources" vorhanden ist.
src/test/resources/sample1.txt
test1
src/test/resources/sample2.txt
test2
src/test/java/FooTest.java
public class FooTest {
@Test
public void testInput() throws Exception {
Foo foo = new Foo();
foo.sample1(); // src/main/resources/sample1.Lesen Sie txt
foo.sample2(); // src/test/resources/sample2.Lesen Sie txt
}
}
Ausführungsergebnis
sample1
test2
Im Fall von 1 ist dies natürlich, da der Pfad direkt geschrieben wird, aber "sample1.txt" im Verzeichnis "src / main / resources" gelesen wird. Im Fall von 2 wird "sample2.txt" im Verzeichnis "src / test / resources" vor "src / main / resources" gelesen.
Wenn sich im Verzeichnis "src / test / resources" kein "sample2.txt" befindet, wird das "sample2.txt" im Verzeichnis "src / main / resources" unverändert gelesen.
Sollte ich vorerst "Class # getResourceAsStream" verwenden? Ich würde mich freuen, wenn Sie mich wissen lassen könnten, wenn Sie irgendwelche Probleme haben.
Referenz: Ressourcen abrufen [Java] Unterschiede beim Abrufen von Dateien im Klassenpfad
Ich habe den absoluten Pfad über "Class # getResource" anstelle von "Class # getResourceAsStream" erhalten und ihn an "Paths # get" übergeben, was zu "java.nio.file.InvalidPathException" führte.
String filename= "/sample2.txt";
String filepath = getClass().getResource(filename).getPath();
Path path = Paths.get(filepath); // java.nio.file.InvalidPathException
Es scheint, dass der Laufwerksbuchstaben in der Windows-Umgebung maskiert werden muss, und ich konnte ihn erhalten, indem ich ihn wie folgt ersetzte.
String filename= "/sample2.txt";
String filepath = getClass().getResource(filename).getPath();
Path path = Paths.get(filepath .replaceFirst("^/(.:/)", "$1")); // OK
Referenz: Problem mit dem Java NIO-Dateipfad erstellen
Recommended Posts