Java 文件迭代在资源文件夹上不工作?
为什么我不能在本例中遍历文件:Java 文件迭代在资源文件夹上不工作?,java,maven,file,path,Java,Maven,File,Path,为什么我不能在本例中遍历文件: private List<String> bilder; private int bildNummer; public void initialize(URL location, ResourceBundle bundle) { // before maven: ladeBilder(new File("/img/settings")); ladeBilder(new File(String.valu
private List<String> bilder;
private int bildNummer;
public void initialize(URL location, ResourceBundle bundle) {
// before maven: ladeBilder(new File("/img/settings"));
ladeBilder(new File(String.valueOf((SettingsController.class.getResource("/img/settings")))));
//imgView.setImage(uebergebeBilder());
}
private Image uebergebeBilder() {
if(bildNummer <= 13){
String bild = bilder.get(bildNummer);
bildNummer++;
return new Image("sample/img/settings/"+bild);
} else{
bildNummer = 0;
String bild = bilder.get(bildNummer);
bildNummer++;
return new Image("sample/img/settings/"+bild);
}
}
private void ladeBilder(final File pfad) {
if(bilder == null) {
bilder = new ArrayList<String>();
} else {
bilder.clear();
}
File[] files = pfad.listFiles((dir, name) -> {
if(name.equals(".DS_Store")){
return false;}
else if(name.equals("thumbs.db")){
return false;
}else{
return true;
}
});
for(File f : files) {
if(f.isDirectory()) {
ladeBilder(f);
} else {
bilder.add(f.getName());
}
}
}
显然,你改变了:
ladeBilder(new File("/img/settings"));
到
它停止工作了。问题是getResource
不返回文件名。它返回一个URL
,然后使用String.valueOf(Object)
将URL
转换为字符串,然后将该字符串视为文件名
但它不是一个文件名。它是一个url字符串。它看起来像这样:
jar:file:/path/to/jar!/img/settings
因此,当您在该url字符串上新建文件(urlString)
时,您将得到一个文件
对象,该对象引用一个不存在的文件。最终你会得到一个NPE(显然)
如何解决这个问题
您试图做的是迭代资源路径中给定树中的资源。简单地说,您不能使用文件I/O库(文件
,路径
,文件
,等等),因为资源名称空间不是文件系统名称空间
您需要使用另一种方法。有多种方法可以做到这一点;见下文:
在我添加Maven框架之前,它已经工作了 这不是马文的错 更好的描述是,当您在开发环境中访问文件系统中的资源时,它可以工作。它崩溃了,因为您将资源包含在一个JAR文件中,并更改了代码以从那里访问它们
无论您使用何种方法创建JAR文件,都会发生这种情况。显然,您更改了:
ladeBilder(new File("/img/settings"));
到
它停止工作了。问题是getResource
不返回文件名。它返回一个URL
,然后使用String.valueOf(Object)
将URL
转换为字符串,然后将该字符串视为文件名
但它不是一个文件名。它是一个url字符串。它看起来像这样:
jar:file:/path/to/jar!/img/settings
因此,当您在该url字符串上新建文件(urlString)
时,您将得到一个文件
对象,该对象引用一个不存在的文件。最终你会得到一个NPE(显然)
如何解决这个问题
您试图做的是迭代资源路径中给定树中的资源。简单地说,您不能使用文件I/O库(文件
,路径
,文件
,等等),因为资源名称空间不是文件系统名称空间
您需要使用另一种方法。有多种方法可以做到这一点;见下文:
在我添加Maven框架之前,它已经工作了 这不是马文的错 更好的描述是,当您在开发环境中访问文件系统中的资源时,它可以工作。它崩溃了,因为您将资源包含在一个JAR文件中,并更改了代码以从那里访问它们
无论您使用何种方法创建JAR文件,都会发生这种情况。@StephenC:谢谢。这将是一个很好的解决方案,下次我真的需要这个。但经过一段时间的思考,我得出结论,我只是走了一条更简单的路。因为我知道所有文件,所以只需使用以下方法(在开始时将bildNummer设置为1):
@斯蒂芬斯:谢谢。这将是一个很好的解决方案,下次我真的需要这个。但经过一段时间的思考,我得出结论,我只是走了一条更简单的路。因为我知道所有文件,所以只需使用以下方法(在开始时将bildNummer设置为1):
private void Bilder(){
System.out.println("/img/settings/"+bildNummer+".jpg");
InputStream inputStream = SettingsController.class.getResourceAsStream("img/settings/"+bildNummer+".jpg");
imgView.setImage(new Image(inputStream));
if(bildNummer==14){
bildNummer=1;
}else{
bildNummer++;
}
}