为什么无法从资源获取文件?

时间:2019-02-26 21:22:24

标签: java file csv resources embedded-resource

为什么我不能从资源中获取文件?

URL resource = getClass().getClassLoader().getResource("input data/logic test.csv");
    System.out.println("Found "+resource);

    CSVParser parser = new CSVParserBuilder().withSeparator(';').build();
    CSVReader reader = new CSVReaderBuilder(new FileReader(resource.getFile())).withSkipLines(1).withCSVParser(parser).build();

控制台输出:

Found file:/home/alexandr/Repos/OTUS/first_home_work/target/classes/input%20data/logic%20test.csv 

Exception in thread "main" java.io.FileNotFoundException: /home/alexandr/Repos/OTUS/first_home_work/target/classes/input%20data/logic%20test.csv (Нет такого файла или каталога)

4 个答案:

答案 0 :(得分:1)

此行存在一个固有的逻辑问题:

CSVReader reader = new CSVReaderBuilder(
    new FileReader(resource.getFile()))..

一旦CSV是Jar的一部分,它将不再作为File对象进行访问。但是类似这样的东西应该可以直接用于URL。

CSVReader reader = new CSVReaderBuilder(
    new InputStreamReader(resource.openStream()))..
  

更改目录名和文件名中_的空间,并正常工作

这仅在Jar文件中的资源不是 时有效。

答案 1 :(得分:0)

是:

try (InputStream raw = ClassThisIn.class.getResourceAsStream(""input data/logic test.csv")) {
    InputStreamReader isr = new InputStreamReader(raw, StandardCharsets.UTF_8);
    BufferedReader br = new BufferedReader(isr);
    // now use br as if it was your filereader.
}

这解决了许多问题:

  1. 无论您如何运行,它仍然有效:您的代码段仅在作为纯类文件运行(相对于在jar中)运行时有效,而在涉及空格的情况下则无效。
  2. 即使您的类是子类,它仍然可以工作(getClass().getClassLoader().getResource不会,这就是为什么您不应该这样做)。
  3. 即使平台本地字符集编码很奇怪,它仍然可以工作(此答案中的代码段对此很明确。这始终是个好主意)。
  4. 没有资源泄漏。您的代码永远不会安全关闭您打开的阅读器。如果您打开资源,则可以在try-with-resources构造中进行,或者将资源存储在字段中并实现AutoClosable。

答案 2 :(得分:0)

我在目录名和文件名中更改_的空间,然后工作。

答案 3 :(得分:-1)

答案在控制台输出中-根本找不到该文件。 我会尝试使用与您编写的代码相同的代码,但是使用的文件中没有空格-看看是否仍然找不到该文件。