列出JAR资源文件夹中所有子目录的名称

时间:2019-02-26 15:18:07

标签: java spring-boot jar apache-commons

我使用maven将Spring Boot项目打包到JAR中。我想读取资源文件夹中“ 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();
    }

3 个答案:

答案 0 :(得分:0)

我认为您应该改用FileUtils

特别是方法listFilesAndDirs和过滤器DirectoryFileFilter

答案 1 :(得分:0)

您也可以简单地执行以下操作:

 File f = new File("static/foo/");
 File[] arr = f.listFiles();
 for (File file : arr) {
     if (file.isDirectory())
        System.out.println(file);
 }

答案 2 :(得分:0)

https://stackoverflow.com/a/3923685/7610371

可以解决这种声音

上面答案中的“核心”位:

'create filenames
message = "Please enter the date you want to save down US Industrials Data for (dd/mm)"
dateenter = Application.InputBox(message, "Enter date")
inputday = Format(Day(dateenter), "00")
inputmonth = Format(Month(dateenter), "00")