获取资源包中的所有文件名并处理 nonjar 和 jar 运行

getting all file names within a resource package and working for nonjar and jar running

我已经为如此不准确的标题道歉,但这个问题已经 要在特殊情况下。 我目前正在写一些 Sokoban-game 并且我有一些 preset-games 各种 .txt 文件。这些文件位于 src-folder 中的 /resources/presets/* .txt 中。所以当我构建一个 jar-file 时,它们也将位于此处: .../GameBox.jar!/resources/presets/*.txt

从那个包中读取已知的文本文件没有问题(我就是这样做的)

BufferedReader rd = new BufferedReader(new InputStreamReader(getClass().getResourceAsStream("/resources/presets/standard.txt")));

但是我想要一个包含该包中所有文本文件的列表,这样我就可以在它们之间切换,只需将它们放在文件夹中即可添加新文件。

程序包中的文本文件列表应该在程序 运行s 通过 javac 命令或从 jar-file.

中创建时创建

我在这里查看了其他一些 Whosebug 代码,例如:

List<String> getResourceFiles(String path) throws IOException{
    List<String> filenames = new ArrayList<>();
    try(InputStream in = getResourceAsStream(path);
        BufferedReader br = new BufferedReader(new InputStreamReader(in))) {
        String resource;
        while((resource=br.readLine())!=null){
            filenames.add(resource);
        }
    }
    return filenames;
}

private  InputStream getResourceAsStream(String resource){
    final InputStream in = getContextClassLoader().getResourceAsStream(resource);
    System.out.println(in);
    return in==null?getClass().getResourceAsStream(resource):in;
}

private  ClassLoader getContextClassLoader() {
    System.out.println(Thread.currentThread().getContextClassLoader());
    return Thread.currentThread().getContextClassLoader();
}

还有这个:

public static List<String> getFiles(String paths) {
    List<String> filesList = new ArrayList<>();
    List<File> files = new ArrayList<>();
    for (final String path : paths.split(File.pathSeparator)) {
        final File file = new File(path);
        System.out.println(path);
        if( file.isDirectory()) {
            recurse(files, filesList, file);
        }
        else {
            filesList.add(file.getName());
        }
    }
    return filesList;
}
private static void recurse(List<File> filesList, List<String> files, File f) {
    File list[] = f.listFiles();
    for (File file : list) {
        if (file.isDirectory()) {
            recurse(filesList, files, file);
        }
        else {
            filesList.add(file);
            files.add(file.getName());

        }
    }
}

这两种不同的方法都适用于使用 javac 命令的程序 运行nning,但是当我构建 jar-file 并尝试 运行 时,其中的 NONE 有效它。

如果有人担心的话,我使用 Intellij 来编码和构建 jar 文件

PS:我不想使用像 spring 这样的新包(例如 PathMatchingResourcePatternResolver)

Jar 不像文件系统(就像可以用作 File)。

此处采用的方法是包含一个基于 file.list 的文本,该文本是在构建 Jar 时准备(并包含)的。该应用程序。可以使用类似以下内容获取列表:

URL fileListURL = getClass().getResource("/resource/file.list");

然后在加载(或列出)每个之前继续逐行阅读列表。