我使用maven将Spring Boot项目打包到JAR中。我想在resources文件夹中的“static / foo”下读取所有目录的名称。
使用Apache Commons库尝试以下操作:
String fooPath = "static/foo/";
List<String> fooFolders = IOUtils.readLines(this.getClass().getClassLoader().getResourceAsStream(fooPath), Charsets.UTF_8);
// The fooFolders list is empty ...
这个解决方案使用JarFile工作(从https://stackoverflow.com/a/48190582/1427624略微修改):
String fooPath = "static/foo";
URL url = Thread.currentThread().getContextClassLoader().getResource(fooPath);
// Not running from JAR
if (url.getProtocol().equals("file"))
{
try {
// Get list of subdirectories' folder names
List<String> fooFolders = IOUtils.readLines(this.getClass().getClassLoader().getResourceAsStream(fooPath), Charsets.UTF_8);
// Loop subdirectories
for (String fooFolder : fooFolders) {
// The current subdirectory path
String fooFolderPath = fooPath + "/" + fooFolder;
// Loop all files in this subdirectory, if needed
List<String> fooFiles = IOUtils.readLines(this.getClass().getClassLoader().getResourceAsStream(fooFolderPath), Charsets.UTF_8);
for (String fooFile : fooFiles) {
// The updated path of the file
String fooFilePath = fooFolderPath + "/" + fooFile;
// Read the file's content
InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream(fooFilePath);
StringWriter writer = new StringWriter();
IOUtils.copy(inputStream, writer, Charsets.UTF_8);
String fileContent = writer.toString();
}
}
}
catch (IOException e) {
e.printStackTrace();
}
}
// Running from JAR
else if (url.getProtocol().equals("jar")) {
String dirname = fooPath + "/";
String path = url.getPath();
String jarPath = path.substring(5, path.indexOf("!"));
List<String> fooFolders = new ArrayList<String>();
HashMap<String, List<String>> fooFiles = new HashMap<String, List<String>>();
try (JarFile jar = new JarFile(URLDecoder.decode(jarPath, StandardCharsets.UTF_8.name()))) {
Enumeration<JarEntry> entries = jar.entries();
while (entries.hasMoreElements()) {
JarEntry entry = entries.nextElement();
String jarEntryName = entry.getName();
String updated_dir_name = "BOOT-INF/classes/" + dirname;
// Only get files that are in the directory we require (fooPath)
if (jarEntryName.startsWith(updated_dir_name) && !dirname.equals(updated_dir_name)) {
// Get the resource URL
URL resourceURL = Thread.currentThread().getContextClassLoader().getResource(jarEntryName);
// Files only
if (!jarEntryName.endsWith("/")) {
// Split the foo number and the file name
String[] split = jarEntryName.split("/");
// First level subdirectories inside fooPath
// BOOT-INF/classes/static/foo/1/myfile.html
// We want to read the folder name "1"
String folderName = split[split.length - 2];
// If you want to read this file
// Read the file's content
// InputStream inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream(resourceURL);
}
}
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
我认为你应该使用FileUtils
代替。
特别是,方法listFilesAndDirs
与过滤器DirectoryFileFilter
。
您也可以简单地执行以下操作:
File f = new File("static/foo/");
File[] arr = f.listFiles();
for (File file : arr) {
if (file.isDirectory())
System.out.println(file);
}
听起来像这样可以通过https://stackoverflow.com/a/3923685/7610371来解决
上面答案中的“核心”位:
InputStream resourceStream = this.getClass().getClassLoader().getResourceAsStream(fooPath);
BufferedReader br = new BufferedReader(new InputStreamReader(resourceStream))
String resource;
while ((resource = br.readLine()) != null) {
// ... resource is the next filename; you can add it to an array
// or use it here
}