How to read files from the sub folder of resource folder with using URI
How to read files from the sub folder of resource folder.
I have some json file in resources folder like :
src
main
resources
jsonData
d1.json
d2.json
d3.json
Now I want to read this in my class which is
src
main
java
com
myFile
classes
here is what I am trying.
File[] fileList = (new File(getClass().getResource("/jaonData").toURI())).listFiles();
for (File file : listOfFiles) {
if (file.isFile()) {
// my operation of Data.
}
}
my things are working fine but the problem what I am getting is i don't want to use toURI
as it is getting failed.
CodePudding user response:
You're probably not using Spring Boot, so how to read folder from the resolurces files in spring boot, : Getting error while running from Jar won't help you much.
I'll repeat myself from a comment to that question:
Everything inside a JAR file is not a file, and cannot be accessed using
File
,FileInputStream
, etc. There are no official mechanisms to access directories in JAR files.
Fortunately, there is a non-official way, and that uses the fact that you can open a JAR file as a separate file system.
Here's a way that works both with file-based file systems and resources in a JAR file:
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)
}
If you don't like using ProtectionDomain
, you can use another little trick, that makes use of the fact that every class file can be read as resource:
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));
}