如何让Maven从我的资源文件夹中读取文件

时间:2019-02-28 10:56:30

标签: java maven

我一直很高兴地使用JUnit运行测试,一切都很好。

但是,我现在需要使用Maven,但是由于某种原因,它找不到我的任何资源文件。

文件位于预期位置:src / main / resources

我正在使用以下代码尝试读取文件:

public Map<String, String> readCsv(String filename) {

    Map<String, String> headersAsMap;
    CSVDataManipulator csvDataManipulator = new CSVDataManipulator();
    ClassLoader classLoader = getClass().getClassLoader();
    String wrkbook = new File(classLoader.getResource(filename).getFile()).toString();
    headersAsMap = csvDataManipulator.getAllRecordsAsMap(wrkbook);
    return headersAsMap;
}

但是,请尝试尝试它找不到文件。 我尝试了很多不同的代码,并尝试将文件移动到不同的位置,但是我无法让Maven找到我的资源文件。

任何帮助将不胜感激! 谢谢

3 个答案:

答案 0 :(得分:0)

据我所知,classLoader.getResource(..)希望文件位于与类的包匹配的文件夹结构中。因此,如果您的课程包是com.matt.stuff,则必须将csv文件放入src / main / resources / com / matt / stuff。

或者您可以使用它来获取您的csv文件:

private static String readFile(String fileName) throws IOException {
    //filename can be src/main/resources/my-csv.csv
    return new String(Files.readAllBytes(Paths.get(fileName))); 
}

答案 1 :(得分:0)

这是我的基于Maven项目的文件结构,该项目是根据quick-start-archetype创建的,并添加了comons-io作为依赖项:

src
src/main
src/main/java
src/main/java/com
src/main/java/com/essexboy
src/main/java/com/essexboy/App.java
src/main/resources
src/main/resources/dir1
src/main/resources/dir1/test.txt
src/main/resources/dir2
src/main/resources/dir2/test.txt
src/main/resources/test.txt
src/test
src/test/java
src/test/java/com
src/test/java/com/essexboy
src/test/java/com/essexboy/AppTest.java

这是我的考试

public class AppTest {
    @Test
    public void shouldAnswerWithTrue() throws Exception {

        StringWriter writer = new StringWriter();
        IOUtils.copy(getClass().getResourceAsStream("/test.txt"), writer, Charset.defaultCharset());
        assertEquals("from root", writer.toString().trim());

        writer = new StringWriter();
        IOUtils.copy(getClass().getResourceAsStream("/dir1/test.txt"), writer, Charset.defaultCharset());
        assertEquals("from dir1", writer.toString().trim());

        writer = new StringWriter();
        IOUtils.copy(getClass().getResourceAsStream("/dir2/test.txt"), writer, Charset.defaultCharset());
        assertEquals("from dir2", writer.toString().trim());
    }
}

答案 2 :(得分:0)

File确实是文件系统上的文件。对于资源(可能是压缩在jar中的文件,并且在类路径上具有路径),您还需要其他内容。

传统上,人们会使用更通用的InputStream代替File。

InputStream in = getClass().getResourceAsStream("/.../x.csv"); // Path on the class path

使用比Path更通用的新类File,您可以处理多个(虚拟)文件系统:

URL url = getClass().getResource("/.../x.csv"); // Path on the class path
Path path = Paths.get(url.toURI());

Files.copy(path, Paths.get("..."));

幸运的是,您的CSVManipulator除了应使用文件参数化外,还应使用InputStreamReadernew InputStreamReader(in, "UTF-8")