获取资源包中的所有文件名,并为nonjar和jar运行工作

时间:2018-05-05 11:52:28

标签: java jar embedded-resource

我已经为这么准确的标题道歉,但这个问题已经存在 在特殊情况下。 我目前正在写一个小的推箱子游戏,我有一些预设游戏 各种.txt文件。这些文件位于src-folder中的/ resources / presets / * .txt中。因此,当我构建一个jar文件时,它们也将位于此处: ... / GameBox.jar!/资源/预置/ *。TXT

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

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

但是我希望列出该包中的所有文本文件,因此我可以在它们之间进行切换,只需将它们放在文件夹中即可添加新的文本文件。

当程序通过javac命令运行或在jar文件中运行时,应创建程序包中的文本文件列表。

我在这里查看了其他一些stackoverflow代码,如下所示:

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命令运行的程序,但是当我构建一个jar文件并尝试运行它时,NONE会起作用。

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

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

1 个答案:

答案 0 :(得分:1)

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

在这里追求的方法是包括一个基于文本的file.list,它是在Jar建立时准备好的(并包含在内)。该应用程序。可以使用以下内容获取列表:

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

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