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 aus einem Komponententest in /src/test/Java/MyTest.Java
laden.
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 probiert
InputStream is = (InputStream) MyTest.class.getResourcesAsStream(test.csv))
Das funktioniert auch nicht. Es gibt null
zurück. Ich benutze Maven, um mein Projekt zu bauen.
Versuchen Sie das nächste:
ClassLoader classloader = Thread.currentThread().getContextClassLoader();
InputStream is = classloader.getResourceAsStream("test.csv");
Wenn das obige nicht funktioniert, wurden verschiedenen Projekten die folgende Klasse hinzugefügt: ClassLoaderUtil
1 (Code hier ).2
Hier einige Beispiele, wie diese Klasse verwendet wird:
src\main\Java\com\company\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<String> 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
}
Notizen
Versuchen:
InputStream is = MyTest.class.getResourceAsStream("/test.csv");
IIRC getResourceAsStream()
ist standardmäßig relativ zum Paket der Klasse.
Hier ist eine schnelle Lösung mit der Verwendung 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);
}
Verwendungszweck:
String fixture = this.readResource("filename.txt", Charsets.UTF_8)
Versuchen Sie fließende Codes für das Spring-Projekt
ClassPathResource resource = new ClassPathResource("fileName");
InputStream inputStream = resource.getInputStream();
Oder bei einem Projekt ohne Feder
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 einem von maven erstellten Ressourcenverzeichnis.
scr/main/resources/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 der gesamte Quellcode auch Ihnen helfen wird, Viel Spaß!
ClassLoader loader = Thread.currentThread().getContextClassLoader();
InputStream is = loader.getResourceAsStream("test.csv");
Wenn Sie den Kontext ClassLoader zum Suchen einer Ressource verwenden, wird dies definitiv die Anwendungsleistung kosten.
Importieren Sie Folgendes:
import Java.io.IOException;
import Java.io.FileNotFoundException;
import Java.io.BufferedReader;
import Java.io.InputStreamReader;
import Java.io.InputStream;
import Java.util.ArrayList;
Die folgende Methode gibt eine Datei in einer ArrayList of Strings zurück:
public ArrayList<String> loadFile(String filename){
ArrayList<String> lines = new ArrayList<String>();
try{
ClassLoader classloader = Thread.currentThread().getContextClassLoader();
InputStream inputStream = classloader.getResourceAsStream(filename);
InputStreamReader streamReader = new InputStreamReader(inputStream, StandardCharsets.UTF_8);
BufferedReader reader = new BufferedReader(streamReader);
for (String line; (line = reader.readLine()) != null;) {
lines.add(line);
}
}catch(FileNotFoundException fnfe){
// process errors
}catch(IOException ioe){
// process errors
}
return lines;
}
Funktioniert der Code, wenn der Maven-Build-Jar nicht ausgeführt wird, z. Wenn ja, vergewissern Sie sich, dass die Datei tatsächlich im Glas enthalten ist. Der Ressourcenordner sollte in der POM-Datei in <build><resources>
enthalten sein.
Die folgende Klasse kann verwendet werden, um eine resource
aus der classpath
zu laden und außerdem eine passende Fehlermeldung zu erhalten, falls ein Problem mit der angegebenen filePath
auftritt.
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
platziert waren. Um eine Datei mit einem anderen Pfad als src/main/resources
zu erhalten, sagen Sie src/test/Java
, müssen Sie sie exklusiv 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 hatte das gleiche Problem Datei aus/src/main/resources lesen/
maven hat das Problem verursacht https://stackoverflow.com/a/55409569/4587961
mvn clean install
Die Dateien, die Sie zum Ressourcenordner hinzugefügt haben, werden in maven build gespeichert und stehen der Anwendung zur Verfügung.
Ich möchte meine Antwort behalten: Es erklärt nicht, wie eine Datei gelesen wird (andere Antworten erklären dies), es antwortet warum InputStream
oder resource
war null .
Ich habe es sowohl beim Laufen als auch bei IDE durch Schreiben als funktionieren lassen
InputStream schemaStream = ProductUtil.class.getClassLoader().getResourceAsStream(jsonSchemaPath);
byte[] buffer = new byte[schemaStream.available()];
schemaStream.read(buffer);
File tempFile = File.createTempFile("com/package/schema/testSchema", "json");
tempFile.deleteOnExit();
FileOutputStream out = new FileOutputStream(tempFile);
out.write(buffer);