问题 Java:如何在src / main / resources中的test中打开文本文件?


我的项目结构看起来像

project/
       src/main/
               java/ ...
               resources/
                         definitions.txt
               test/
                    CurrentTest.java
               resources/ ...

在我的测试中,我需要打开 definitions.txt

我做

 @Test
 public void testReadDesiredDefinitions() throws PersistenceException, IOException {
        final Properties definitions = new Properties();
        definitions.load(new ResourceService("/").getStream("desiredDefinitions"));
        System.out.println(definitions);
 }

当我跑这个时,我明白了

java.lang.NullPointerException
    at java.util.Properties$LineReader.readLine(Properties.java:418)
    at java.util.Properties.load0(Properties.java:337)
    at java.util.Properties.load(Properties.java:325)

我该如何阅读此文本文件?

谢谢


1449
2017-10-25 17:31


起源

只是出于好奇,这是什么 ResourceService? - KevinDTimm


答案:


单元测试的“当前目录”通常是项目目录,因此使用:

File file = new File("src/main/resources/definitions.txt");

并从文件加载属性:

definitions.load(new FileInputStream(file));

如果这不起作用,或者你想检查当前目录是什么,只需打印出路径,很明显当前目录是什么:

System.out.println(file.getAbsolutePath());

12
2017-10-25 17:35



注意:如果将在JAR发行版中打包definitions.txt,则不起作用。 - Vulcan
@Vulcan肯定,但是 我的项目结构看起来像 很明显,这是源头 - Bohemian♦
我并不否认这一点,但并非所有最终用户都拥有整个源及其结构,例如JAR发行版。 - Vulcan
@Vulcan你提出了一个有趣的观点,我试图不是故意防御,但根据定义,单元测试(这是)有源代码可用。也就是说,这段代码只会作为原始源运行,永远不会在jar中运行。 - Bohemian♦
有趣的是,我没有注意到它是一个单元测试。我认为被测试的单元通常最终会以另一种形式在另一个项目中分发。 - Vulcan


你可以利用 类#的getResourceAsStream 轻松创建资源文件的流。

definitions.load(getClass().getResourceAsStream("/main/java/resources/definitions.txt"));

location参数应该是与项目库有关的相对文件路径(我的猜测是主要的)。


1
2017-10-25 17:37





如果你的 resources 目录是源文件夹,可以使用 /resources/definitions.txt 作为一条正确的道路。

我不知道 ResourceService 但这应该工作:

final Properties definitions = new Properties();
definitions.load(getClass().getResourceAsStream("/resources/definitions.txt"))

0
2017-10-25 17:36



这是给予 java.lang.NullPointerException - daydreamer
您的项目是如何构建的?如果您在名为的文件夹中生成,请关注您的项目结构 classes 例如,那么你将拥有你的 resources 在构建期间复制到其中的文件夹,然后它将工作。 - Alex


文件文件=新文件(“../ src / main / resources / definitions.txt”);


0
2017-10-25 17:39