Java 为什么可以';我不能从资源中心得到一个文件吗?

Java 为什么可以';我不能从资源中心得到一个文件吗?,java,file,csv,resources,embedded-resource,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 CSVRe

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

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 (Нет такого файла или каталога)

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

它是:

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.
}
这解决了许多问题:

  • 无论您如何运行它,它仍然可以工作:您的代码段仅在作为直接类文件运行(而不是在jar中)时工作,如果涉及到空格,则不工作
  • 即使类是子类(
    getClass().getClassLoader().getResource
    不会,这就是为什么不应该这样做)
  • 即使平台本地字符集编码很奇怪,仍然可以工作(这个答案中的代码片段是明确的,这总是一个好主意)
  • 没有资源泄漏。你的代码永远不会安全地关闭你打开的阅读器。如果打开资源,可以在try-with-resources构造中这样做,也可以将资源存储在字段中并实现自动关闭

  • 我在目录名和文件名中更改了uu的空间,并正在工作。。。。天哪。

    这条线路有一个固有的逻辑问题:

    CSVReader reader = new CSVReaderBuilder(
        new FileReader(resource.getFile()))..
    
    一旦CSV成为Jar的一部分,它将不再作为
    文件
    对象进行访问。但是类似的东西应该直接用于URL

    CSVReader reader = new CSVReaderBuilder(
        new InputStreamReader(resource.openStream()))..
    
    更改目录名和文件名中的uu的空间,并进行工作

    这只在资源不在Jar文件中时才起作用