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

问题描述 投票:-1回答:4

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

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 (Нет такого файла или каталога)
java file csv resources embedded-resource
4个回答
1
投票

这条线存在固有的逻辑问题:

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

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

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

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

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


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。

0
投票

我在目录名和文件名中更改了_的空间,并且工作.... omg。


-1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.