Maven exec:java:如何在资源目录中打开和读取文件?

19

这是我的项目结构。

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”目录中查找资源文件?
编辑: 感谢回答我的原始问题。我有一个后续问题:
基本上我想做的是使主类读取“res.txt”,然后生成一个新的“newres.txt”到资源目录,以便稍后在打包阶段将此新的“newres.txt”打包到jar文件中。当前,我将此exec:java挂载到prepare-package阶段。如何在不使用硬编码绝对路径或依赖于Maven目录结构的情况下,在资源目录中创建此“newres.txt”?
5个回答

20

我想我会回答自己的问题,对于我来说Thread.currentThread().getContextClassLoader().getResourceAsStream()是最好的选择,特别是当项目为另一个Web项目生成jar依赖关系时。


你是最棒的!谢谢你 - Angelo

16

我想补充一下答案。

你还可以使用:

InputStream file = ClassLoader.getSystemResourceAsStream("res.txt");

1
这个解决了我的问题!非常感谢你抽出时间写下这个解决方案!!! - Wulf

12

尝试一下

InputStream IS = Main.class.getResourceAsStream("res.txt");

访问res.txt的内容。注意您的文本文件的编码(注意默认值)。例如,如果您的maven项目设置为UTF-8,请确保res.txt也以UTF-8编码,否则,在运行时会出现奇怪的错误。


更多相关内容请查看我最近创建的博客文章:http://tshikatshikaaa.blogspot.nl/2012/07/maven-how-to-access-filesdata-in.html - Jérôme Verstrynge
请参考 http://www.javaworld.com/javaqa/2003-08/01-qa-0808-property.html?page=2,了解何时在资源路径中使用前导斜杠。 - leo

1
当在Eclipse中运行时,res.txt将在Eclipse启动的文件夹中创建/读取。 因此输出是这样的。
如果您想使代码查看类路径中存在的特定文件夹中的文件,则应尝试使用getResourceAsStream()方法。
或者,您可以指定文件的绝对路径。

1
这里是另一个解决方案:
String str = "target/classes/res.txt";

InputStream is = new FileInputStream(new File(str));

如果您在根目录中执行java命令,那么资源将编译到target/classes文件夹中,您可以按照以下方式编写代码。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接