我已经为这么准确的标题道歉,但这个问题已经存在 在特殊情况下。 我目前正在写一个小的推箱子游戏,我有一些预设游戏 各种.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)
答案 0 :(得分:1)
Jar不像文件系统那样(就像可以用作File
)。
在这里追求的方法是包括一个基于文本的file.list
,它是在Jar建立时准备好的(并包含在内)。该应用程序。可以使用以下内容获取列表:
URL fileListURL = getClass().getResource("/resource/file.list");
然后在加载(或列出)每个列表之前逐行阅读列表。