Wie lade ich eine Datei aus dem Ressourcenordner?

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 ich möchte die Datei von einem /src/test/java/MyTest.java in /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 das auch versucht

 InputStream is = (InputStream) MyTest.class.getResourcesAsStream(test.csv)) 

Dies funktioniert auch nicht. Es gibt null . Ich benutze Maven, um mein Projekt zu bauen.

   

Probieren Sie das nächste aus:

 ClassLoader classloader = Thread.currentThread().getContextClassLoader(); InputStream is = classloader.getResourceAsStream("test.csv"); 

Wenn das obige nicht funktioniert, wurden verschiedene Projekte der folgenden class hinzugefügt: ClassLoaderUtil 1 (Code hier ). 2

Hier sind einige Beispiele, wie diese class verwendet wird:

  src \ main \ java \ com \ unternehmen \ test \ YourCallingClass.java 
  src \ main \ java \ com \ opensymphony \ xwork2 \ util \ ClassLoaderUtil.java 
  src \ main \ resources \ test.csv 
 // java.net.URL URL url = ClassLoaderUtil.getResource("test.csv", YourCallingClass.class); Path path = Paths.get(url.toURI()); List lines = Files.readAllLines(path, StandardCharsets.UTF_8); 
 // java.io.InputStream InputStream inputStream = ClassLoaderUtil.getResourceAsStream("test.csv", YourCallingClass.class); InputStreamReader streamReader = new InputStreamReader(inputStream, StandardCharsets.UTF_8); BufferedReader reader = new BufferedReader(streamReader); for (String line; (line = reader.readLine()) != null;) { // Process line } 

Anmerkungen

  1. Sehen Sie es in der Wayback Maschine .
  2. Auch in GitHub .

Versuchen:

 InputStream is = MyTest.class.getResourceAsStream("/test.csv"); 

IIRC getResourceAsStream() standardmäßig relativ zum Paket der class.

Hier ist eine schnelle Lösung mit dem Einsatz von Guava :

 import com.google.common.base.Charsets; import com.google.common.io.Resources; public String readResource(final String fileName, Charset charset) throws IOException { return Resources.toString(Resources.getResource(fileName), charset); } 

Verwendung:

 String fixture = this.readResource("filename.txt", Charsets.UTF_8) 

Versuchen Sie Fließende Codes auf Spring-Projekt

 ClassPathResource resource = new ClassPathResource("fileName"); InputStream inputStream = resource.getInputStream(); 

Oder auf Nicht-Frühling-Projekt

  ClassLoader classLoader = getClass().getClassLoader(); File file = new File(classLoader.getResource("fileName").getFile()); InputStream inputStream = new FileInputStream(file); 

Jetzt illustriere ich den Quellcode zum Lesen einer Schriftart aus dem maven created resources Verzeichnis,

scr / main / ressourcen / calibril.ttf

Bildbeschreibung hier eingeben

 Font getCalibriLightFont(int fontSize){ Font font = null; try{ URL fontURL = OneMethod.class.getResource("/calibril.ttf"); InputStream fontStream = fontURL.openStream(); font = new Font(Font.createFont(Font.TRUETYPE_FONT, fontStream).getFamily(), Font.PLAIN, fontSize); fontStream.close(); }catch(IOException | FontFormatException ief){ font = new Font("Arial", Font.PLAIN, fontSize); ief.printStackTrace(); } return font; } 

Es hat für mich funktioniert und ich hoffe, dass dir auch der gesamte Quellcode weiterhelfen wird, Viel Spaß!

 ClassLoader loader = Thread.currentThread().getContextClassLoader(); InputStream is = loader.getResourceAsStream("test.csv"); 

Wenn Sie den Kontext-ClassLoader verwenden, um eine Ressource zu finden, wird dies definitiv die Anwendungsleistung kosten.

functioniert der Code, wenn das Maven-Build-Jar nicht ausgeführt wird, z. B. beim Ausführen von der IDE? Wenn dies der Fall ist, stellen Sie sicher, dass die Datei tatsächlich im Jar enthalten ist. Der Ressourcenordner sollte in der Pom-Datei in .

Die folgende class kann verwendet werden, um eine resource aus dem classpath zu laden und außerdem eine passende Fehlermeldung zu erhalten, falls ein Problem mit dem angegebenen filePath .

 import java.io.InputStream; import java.nio.file.NoSuchFileException; public class ResourceLoader { private String filePath; public ResourceLoader(String filePath) { this.filePath = filePath; if(filePath.startsWith("/")) { throw new IllegalArgumentException("Relative paths may not have a leading slash!"); } } public InputStream getResource() throws NoSuchFileException { ClassLoader classLoader = this.getClass().getClassLoader(); InputStream inputStream = classLoader.getResourceAsStream(filePath); if(inputStream == null) { throw new NoSuchFileException("Resource file not found. Note that the current directory is the source folder!"); } return inputStream; } } 

getResource () funktionierte nur mit den Ressourcendateien, die nur in src/main/resources abgelegt wurden. Um eine Datei zu erhalten, die sich auf einem anderen Pfad als src/main/resources sagen wir src/test/java , müssen Sie sie explizit erstellen.

Das folgende Beispiel kann Ihnen helfen

 import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.net.URISyntaxException; import java.net.URL; public class Main { public static void main(String[] args) throws URISyntaxException, IOException { URL location = Main.class.getProtectionDomain().getCodeSource().getLocation(); BufferedReader br = new BufferedReader(new FileReader(location.getPath().toString().replace("/target/classes/", "/src/test/java/youfilename.txt"))); } } 

Ich habe dieses Problem getriggers, indem /scr/main/resources Ordner /scr/main/resources zu meinem Java Build Path hinzugefügt /scr/main/resources

Bildbeschreibung hier eingeben

Ich bekomme es ohne Bezug auf “class” oder “ClassLoader” zu arbeiten.

Nehmen wir an, wir haben drei Szenarien mit dem Speicherort der Datei “example.file” und Ihr Arbeitsverzeichnis (in dem Ihre App ausgeführt wird) ist home / mydocuments / program / projects / myapp:

a) Ein Unterordner, der vom Arbeitsverzeichnis abstammt: 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; in Windows ersetzen home / mit C 🙂

1) Erhalte den richtigen Pfad: a) String path = "res/files/example.file"; b) String path = "../projects/files/example.file" b2) String path = "../projects/files/example.file" String path = "../../program/files/example.file" c) String path = "/home/mydocuments/files/example.file"

Wenn es sich um einen Stammordner handelt, starten 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, in einen Ordner zu gehen.

2) Erstellen Sie ein Dateiobjekt, indem Sie den richtigen Pfad übergeben:

 File file = new File(path); 

3) Sie sind jetzt gut zu gehen:

 BufferedReader br = new BufferedReader(new FileReader(file));