我已经为如此精确的标题表示歉意,但是这个问题
在特殊情况下。
我目前正在编写一个推箱子游戏,并且在其中有一些预设游戏
各种.txt文件。这些文件位于src文件夹中的/ resources / presets / * .txt中。因此,当我构建一个jar文件时,它们也将位于此处:
... / GameBox.jar!/ resources / presets / *。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文件并尝试运行它时,这些方法都不起作用。

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

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

最佳答案

Jar的行为不像文件系统(就像可以用作File一样)。

此处采用的方法将包括在构建Jar时准备(包括)基于文本的file.list。该应用程序。可以使用以下方式获取列表:

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


然后继续逐行阅读列表,然后再加载(或列出)每个列表。

08-27 23:52
查看更多