获取资源包中的所有文件名并处理 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");
然后在加载(或列出)每个之前继续逐行阅读列表。
我已经为如此不准确的标题道歉,但这个问题已经 要在特殊情况下。 我目前正在写一些 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");
然后在加载(或列出)每个之前继续逐行阅读列表。