Java获取包中的所有文件

时间:2016-11-15 02:57:25

标签: java

我正在尝试使用以下代码获取Java中的所有文件:

public static ArrayList<String> getThemes() {
        ArrayList<String> themes = new ArrayList<>();

    File folder = new File(Main.class.getResource("fxml/").toString());

        for (File file : folder.listFiles()) {
            if (file.getName().endsWith(".css"))
                themes.add(file.getName().replaceFirst("[.][^.]+$", ""));
        }

    return themes;
}

这段代码应该给我一个名为fxml的包中所有css文件的ArrayList(Full:dev.thetechnokid.rw.fxml)。

我使用了许多其他不同的方法,包括使用当前目录和完整的文件路径,但它仍然提供NullPointerException。堆栈跟踪没有提供足够的信息,只有FXML LoadException

此代码有什么问题?

3 个答案:

答案 0 :(得分:3)

我非常确定Class.getResource()只能检测文件,而不能检测文件夹。&lt; - 我已经纠正了。

Class.getResource在这里不是一个非常有用的抽象。 当您不知道资源是在文件系统中还是在归档内时,此机制非常有用。 ClassLoader将其抽象出来。

在你的情况下,你知道你有文件,所以你也可以直接使用他们的API:

List<String> cssFileNames = Files.walk(Paths.get("fxml"))
                                 .map(Path::getFileName)
                                 .map(Path::toString)
                                 .filter(n -> n.endsWith(".css"))
                                 .collect(Collectors.toList());

但是如果你真的必须使用ClassLoader,一个技巧是从一个已知文件开始,然后向上移动一个级别并从那里开始:

Path path = new File(
        Main.class.getResource("fxml/iKnowThisFileExists.txt").toURI()
).getParentFile().toPath();
List<String> cssFileNames2 = Files.walk(path)
                                 .map(Path::getFileName)
                                 .map(Path::toString)
                                 .filter(n -> n.endsWith(".css"))
                                 .collect(Collectors.toList());

答案 1 :(得分:0)

尝试使用getFile代替toString

File folder = new File(Main.class.getResource("fxml/").getFile());

答案 2 :(得分:0)

我建议:

URL packageURL;
packageURL = classLoader.getResource("fxml/"); 
URI uri = new URI(packageURL.toString());
File folder = new File(uri.getPath());