这是我项目的结构。
proj
---src
----main
----java
----Main.java
----resources
----res.txt
我在Eclipse中使用m2eclipse插件。 在Main.java中,我有
File f = new File("res.txt"); System.out.println(f.getAbsolutePath());
当我运行mvn exec:java时,打印出来的路径是“... \ proj \ res.txt”。如何在“... \ proj \ target \ classes”目录中查找资源文件?
修改
感谢我原来问题的答案。我有一个后续问题:
所以基本上我想做的是让Main类读取“res.txt”,然后生成一个新的“newres.txt”到资源目录,这样我就可以将这个新的“newres.txt”打包到稍后在包阶段中的jar文件。目前我将这个exec:java挂载到prepare-package阶段。如何在资源目录中创建这个“newres.txt”而没有硬编码的绝对路径或者取决于Maven的目录结构?
答案 0 :(得分:20)
我想我会回答我自己的问题,Thread.currentThread().getContextClassLoader().getResourceAsStream()
对我来说效果最好,尤其是当项目为另一个Web项目生成jar依赖项时。
答案 1 :(得分:14)
图I我将添加答案。
您也可以使用:
InputStream file = ClassLoader.getSystemResourceAsStream("res.txt");
答案 2 :(得分:12)
尝试
InputStream IS = Main.class.getResourceAsStream("res.txt");
访问res.txt
的内容。注意文本文件的编码(注意默认值)。例如,如果您的maven项目设置为UTF-8,请确保res.txt
也以UTF-8编码,否则,您将在运行时遇到有趣的错误。
答案 3 :(得分:1)
从eclipse运行时,在/ reader中从启动eclipse的文件夹中创建res.txt
。因此输出。
如果要让代码查看特定文件夹中的文件,该文件夹存在于类路径中,那么您应该尝试使用getResourceAsStream()方法。
或者,您可以指定文件的绝对路径。
答案 4 :(得分:0)
这是另一种解决方法:
String str = "target/classes/res.txt";
InputStream is = new FileInputStream(new File(str));
如果您在根文件夹中执行java
,并且您的资源将编译到target/classes
文件夹中,则可以这样编写代码。