我正在使用JUnit 4,Java 8和Gradle 1.12。
我有一个我需要加载的默认json文件。我的项目有src/main/java/
(包含项目源),src/main/resources/
(空),src/test/java/
(单元测试源)和src/test/resources/
(要加载的json数据文件)目录。 build.gradle
文件位于根目录中。
在我的代码中,我有:
public class UnitTests extends JerseyTest
{
@Test
public void test1() throws IOException
{
String json = UnitTests.readResource("/testData.json");
// Do stuff ...
}
// ...
private static String readResource(String resource) throws IOException
{
// I had these three lines combined, but separated them to find the null.
ClassLoader c = UnitTests.class.getClassLoader();
URL r = c.getSystemResource(resource); // This is returning null. ????
//URL r = c.getResource(resource); // This had the same issue.
String fileName = r.getFile();
try (BufferedReader reader = new BufferedReader(new FileReader(fileName)))
{
StringBuffer fileData = new StringBuffer();
char[] buf = new char[1024];
int readCount = 0;
while ((readCount = reader.read(buf)) != -1)
{
String readData = String.valueOf(buf, 0, readCount);
fileData.append(readData);
}
return fileData.toString();
}
}
}
根据我的阅读,这应该让我访问资源文件。但是,当我尝试使用URL时,我得到一个空指针异常,因为getSystemResource()
调用返回null。
如何访问资源文件?
答案 0 :(得分:15)
资源名称不是以斜杠开头的,因此您需要摆脱它。最好使用UnitTests.getClassLoader().getResourceAsStream("the/resource/name")
来阅读资源,如果需要File
,则应new File(UnitTests.getClassLoader().getResource("the/resource/name").toURI())
。
在Java 8上,您可以尝试类似:
URI uri = UnitTests.class.getClassLoader().getResource("the/resource/name").toURI();
String string = new String(Files.readAllBytes(Paths.get(uri)), Charset.forName("utf-8"));
答案 1 :(得分:0)
我认为你想要getResource而不是getSystemResource。例如,后者用于从文件系统中读取文件,其中路径不会以jar形式指定。
您也可以跳过类加载器:UnitTests.class.getResource("...")
修改:答案here中有一些更详细的评论。