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
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
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
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));