[FIXED] So lesen Sie Dateien aus dem Unterordner des Ressourcenordners mit toURI

Ausgabe

So lesen Sie Dateien aus dem Unterordner des Ressourcenordners mit URI

    How to read files from the sub folder of resource folder.

Ich habe eine JSON-Datei im Ressourcenordner wie:

src 
    main
        resources 
            jsonData
                d1.json
                d2.json
                d3.json

Jetzt möchte ich das in meiner Klasse lesen

src 
    main
        java
            com
                myFile
                    classes 

Hier ist, was ich versuche.

 File[] fileList = (new File(getClass().getResource("/jaonData").toURI())).listFiles();
    
            for (File file : listOfFiles) {
                if (file.isFile()) {
                   // my operation of Data.
                }
            }

Meine Sachen funktionieren gut, aber das Problem, was ich bekomme, ist, dass ich es nicht verwenden möchte, toURIda es fehlschlägt.

Lösung

Sie verwenden Spring Boot wahrscheinlich nicht. So lesen Sie den Ordner aus den Resolurces-Dateien im Spring Boot: Wenn Sie beim Ausführen von Jar einen Fehler erhalten, wird Ihnen das nicht viel helfen.

Ich wiederhole mich aus einem Kommentar zu dieser Frage:

Alles in einer JAR-Datei ist keine Datei und kann nicht mit File, FileInputStreamusw. aufgerufen werden. Es gibt keine offiziellen Mechanismen, um auf Verzeichnisse in JAR-Dateien zuzugreifen.

Glücklicherweise gibt es einen nicht offiziellen Weg, der die Tatsache nutzt, dass Sie eine JAR-Datei als separates Dateisystem öffnen können.

Hier ist ein Weg, der sowohl mit dateibasierten Dateisystemen als auch mit Ressourcen in einer JAR-Datei funktioniert:

private void process() throws IOException {
    Path classBase = getClassBase();
    if (Files.isDirectory(classBase)) {
        process(classBase);
    } else {
        // classBase is the JAR file; open it as a file system
        try (FileSystem fs = FileSystems.newFileSystem(classBase, getClass().getClassLoader())) {
            Path root = fs.getPath("/");
            return loadFromBasePath(root);
        }
    }
} 

private Path getClassBase() {
    ProtectionDomain protectionDomain = getClass().getProtectionDomain();
    CodeSource codeSource = protectionDomain.getCodeSource();
    URL location = codeSource.getLocation();
    try {
        return Paths.get(location.toURI());
    } catch (URISyntaxException e) {
        throw new IllegalStateException(e);
    }
}

private void processRoot(Path root) throws IOException {
    // use root as if it's either the root of the JAR, or target/classes
    // for instance
    Path jsonData = root.resolve("jsonData");
    // Use Files.walk or Files.newDirectoryStream(jsonData)
}

Wenn Sie nicht gerne verwenden ProtectionDomain, können Sie einen anderen kleinen Trick verwenden, der sich die Tatsache zunutze macht, dass jede Klassendatei als Ressource gelesen werden kann:

private Path getClassBase() {
    String resourcePath = '/' + getClass().getName().replace('.', '/') + ".class";
    URL url = getClass().getResource(resourcePath);
    String uriValue = url.toString();
    if (uriValue.endsWith('!' + resourcePath)) {
        // format: jar:<file>!<resourcePath>
        uriValue = uriValue.substring(4, uriValue.length() - resourcePath.length() - 1);
    } else {
        // format: <folder><resourcePath>
        uriValue = uriValue.substring(0, uriValue.length() - resourcePath.length());
    }
    return Paths.get(URI.create(uriValue));
}


Beantwortet von –
Rob Spoor


Antwort geprüft von –
Mildred Charles (FixError Admin)

0 Shares:
Leave a Reply

Your email address will not be published. Required fields are marked *

You May Also Like