从源代码动态访问src / main / resources /

时间:2014-08-31 18:54:29

标签: java

我的文件位于projectRoot/src/main/resources/levels/

enter image description here

如果我拨打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

1 个答案:

答案 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,您通常不应该这样做。如果您需要资源,您可以通过名称知道它,因此可以使用上面列出的方法之一来获取它。