it-swarm.com.de

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 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: ClassLoaderUtil1 (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

  1. Sieh es in Die Wayback-Maschine.
  2. Auch in GitHub .
175
Paul Vargas

Versuchen:

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

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

41
vanza

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)
29
Datageek

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

Jetzt illustriere ich den Quellcode zum Lesen einer Schriftart aus einem von maven erstellten Ressourcenverzeichnis. 

scr/main/resources/calibril.ttf

 enter image description here

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ß!

5
ArifMustafa
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. 

4
Bimales Mandal

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;
}
1
shalamus

Ich habe dieses Problem durch Hinzufügen des /scr/main/resources-Ordners zu meinem Java Build Path gelöst.

 enter image description here

0
sklimkovitch

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.

0
Jorn

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;
    }
}
0
BullyWiiPlaza

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")));
    }
}
0
Piyush Mittal

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 .

0
Yan Khonski

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