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, toURI
da 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
,FileInputStream
usw. 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)