Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 文件迭代在资源文件夹上不工作?_Java_Maven_File_Path - Fatal编程技术网

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++;
        }
    }