getResourceAsStream() - 使用相对路径

时间:2015-04-24 20:22:56

标签: java maven junit inputstream relative-path

我正在使用Maven并在静态方法上运行JUnit测试,该方法尝试使用以下方式读取文件:

InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream(filename);

然后使用new InputStreamReader(is)在另一个电话中用作读者。当filename只是文件名(例如file.csv)但filename是相对路径(例如src/test/resources/file.csv),is最终为{{{ 1}}。

我需要它来处理相对路径,因为我通过JUnit运行测试套件,查找具有相对路径的资源,这些测试来自我无法控制变更的JAR(即我实现了测试套件使用自己的资源调用自己的测试的外观实现类 - 它们不受我的控制。)

这种方法是否有办法使用相对路径,或者我可以在我的类路径上找到测试所需的那些资源?

3 个答案:

答案 0 :(得分:1)

在maven中运行测试,src/test/resources/(默认情况下)“映射”到类(加载程序)路径的 root ,因此在您的情况下file.csv是更正src/test/resources/file.csv绝对路径。

要成功加载"src/test/resources/file.csv"(资源),您应该将此文件(物理上)可用:src/test/resources/src/test/resources/file.csvsrc/main/java(也将映射到cp root)。 。/src/test/resources/file.csv

答案 1 :(得分:0)

在您的情况下,is最终为空,因为在执行资源查找时,resources目录是入口点,因此完整路径应为test/resources/src/test/resources/file.csv或{{ 1}}取决于你如何运行测试。

实现目标的唯一可靠方法是手动关注正确性。也许是这样的:

test/resources/src/test/resources/file.csv

也许你必须根据你的案例的具体情况(可能的嵌套指令的帐户等)编写它,但我真的认为,鉴于你的输入可能是任意性质的,这将不会变得更简单。

答案 2 :(得分:0)

我在博客上(西班牙文)

http://lacuevadeyogui.blogspot.com/2015/04/diferencia-entre-uri-y-url.html

src / test / resources

中对文件的引用问题

试试这个

URL url = getClass().getClassLoader().getResource("file.csv");
File f;
try {
    f = new File(url.toURI());
} catch (URISyntaxException e) {
    f = new File(url.getPath());
}

最后,将文件转换为inputStream。