Meine Dateihierarchie:

>resources:
    >static:
        >css:
        >json:
            >networks:
                >network-list.json
        >js:
        >img:

Ich habe versucht, eine neue Datei zu erstellen über:

File jsonNetworkDetailsFile = new File("/json/networks/network-list.json");
File jsonNetworkDetailsFile = new File("static/json/networks/network-list.json");
File jsonNetworkDetailsFile = new File("../json/networks/network-list.json");
File jsonNetworkDetailsFile = new File("../../json/networks/network-list.json");
File jsonNetworkDetailsFile = new File("/json/networks/network-list.json");

... und noch mehr. Nichts davon funktioniert.

Ich bekomme immer noch die

java.io.FileNotFoundException: the system cannot find the path specified

Was ist der richtige Weg?

BEARBEITEN

Eine Lösung gefunden. Musste den vollständigen Pfad zur Datei einschließen wie:

 File jsonNetworkDetailsFile = new File("src/main/resources/static/json/networks/Turtlecoin/turtlecoin-pools.json");

EDIT2

Wie TwiN sagte, ist es unmöglich, eine Datei über das File - Objekt zu referenzieren, sobald die App in .jar gepackt ist. Eine richtige Lösung wäre:

InputStream jsonNetworkDetailsFile = new ClassPathResource("/static/json/networks/network-list.json").getInputStream();
1
Maciaz 16 Apr. 2018 im 13:41

4 Antworten

Beste Antwort
InputStream is = new ClassPathResource("/someFile.txt").getInputStream();

Dabei befindet sich /someFile.txt in Ihrem Ressourcenordner.

Wie in erwähnt Dokumentation für ClassPathResource:

Unterstützt die Auflösung als java.io.File, wenn sich die Klassenpfadressource im Dateisystem befindet, jedoch nicht für Ressourcen in einer JAR. Unterstützt immer die Auflösung als URL.

Mit anderen Worten, Sie möchten die getInputStream() -Methode für Ihren Fall verwenden:

InputStream is = new ClassPathResource("/someFile.txt").getInputStream();
try {
    String contents = new String(FileCopyUtils.copyToByteArray(is), StandardCharsets.UTF_8);
    System.out.println(contents); // do something with the content here
    is.close();
} catch (IOException e) {
    e.printStackTrace();
}

Ich erwähne dies, weil ClassPathResource auch eine getFile() Methode hat.

Weitere Informationen finden Sie unter Referenz

2
TwiN 16 Apr. 2018 im 11:56

Versuchen Sie so etwas:

ClassLoader classLoader = getClass().getClassLoader();
File file = new File(classLoader.getResource("classpath:static/json/networks/network-list.json").getFile());

Sie könnten auch verwenden:

@Value(value = "static/json/networks/network-list.json")
private Resource myFile;

Und dann :

myFile.getInputStream()

(funktioniert nur mit einer Klasse, die mit @Component, @Service ... usw. versehen ist)

1
Oreste Viron 16 Apr. 2018 im 11:00

Sie können dies versuchen, um Dateien aus Ressourcen zu laden:

ClassLoader loader = Thread.currentThread().
getContextClassLoader();
InputStream configStream = loader.getResourceAsStream("/static/json/networks/network-list.json");
0
Elarbi Mohamed Aymen 16 Apr. 2018 im 10:46

Ich denke, Sie sollten den genauen Speicherort für das Dateiobjekt angeben. Eine andere Lösung:

File currDir = new File(".");
String path = currDir.getAbsolutePath();
// String path = "C:\\ExternalFiles\\"; // Or you can give staticly
File jsonNetworkDetailsFile = new File(path);

Ich hoffe es hilft.

0
Oguz 16 Apr. 2018 im 10:58