我的文件位于projectRoot/src/main/resources/levels/
如果我拨打Utils.getFileNamesInDirectory("src/main/resources/levels")
,它就有效
但是在打包项目时,levels
目录位于root
的{{1}}下
我怎样才能在静态类中创建这个动态?即.jar
所以代码将在eclipse中运行并作为独立jar运行。
列出目录中文件的代码..
src/main/resources/
更新
我已经开始使用public class Utils {
public static List<String> getFileNamesInDirectory(String directory){
List<String> results = new ArrayList<String>();
File[] files = new File(directory).listFiles(new FilenameFilter() {
public boolean accept(File dir, String filename) {
return filename.endsWith(".json");
}
});
for (File file : files) {
if (file.isFile()) {
results.add(file.getName());
}
}
Collections.sort(results);
return results;
}
}
(getResourceAsStream
导致getResource
),我可以在IllegalArgumentException: URI is not hierarchical
内的目录中列出文件。
Eclipse
但是当我将它作为独立的.jar运行时,我在此行中收到以下错误:public static List<String> getFileNamesInDirectory(String directory){
List<String> results = new ArrayList<String>();
InputStream in = Utils.class.getResourceAsStream("/" + directory);
BufferedReader rdr = new BufferedReader(new InputStreamReader(in));
String line;
try {
while ((line = rdr.readLine()) != null) {
System.out.println("file: " + line);
results.add(new File(line).getName());
}
rdr.close();
} catch (IOException e1) {
e1.printStackTrace();
}
Collections.sort(results);
return results;
}
为什么它不能在while ((line = rdr.readLine()) != null) {
之外起作用?
Eclipse
答案 0 :(得分:3)
您的代码在Eclipse中工作的原因是Eclipse从项目目录启动java
进程,我们可以假设
Utils.getFileNamesInDirectory("src/main/resources/levels")
是相对于当前工作目录(项目目录)。由于文件系统位置<project-directory>/src/main/resources/levels
存在,因此可以找到并返回给您。
src/main/resources
是一个Maven约定,旨在保存在编译/构建/部署项目时最终会在类路径中结束的资源。要从类路径中检索资源,请使用Class#getResource(String)
,ClassLoader#getResource(String)
和/或ClassLoader#getSystemResource(String)
。
现在,although there are ways to list resources in the classpath,您通常不应该这样做。如果您需要资源,您可以通过名称知道它,因此可以使用上面列出的方法之一来获取它。