我正在尝试使用以下代码获取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
。
此代码有什么问题?
答案 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());