【问题标题】:Why can't I get a file from resources?为什么我无法从资源中获取文件?
【发布时间】:2019-02-26 21:22:23
【问题描述】:

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

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


    【解决方案1】:

    这行有一个内在的逻辑问题:

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

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

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

    在目录名和文件名中为 _ 更改空间,并开始工作

    这只会在资源在 Jar 文件中时起作用。

    【讨论】:

      【解决方案2】:

      是:

      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. 无论您如何运行它,它仍然有效:您的 sn-p 仅在作为直接类文件运行时才有效(相对于在 jar 中),并且在涉及空格时无效。
      2. 即使您的课程是子类,仍然有效(getClass().getClassLoader().getResource 不会,这就是您不应该这样做的原因)。
      3. 即使平台本地字符集编码很奇怪,仍然有效(此答案中的 sn-p 对此很明确。这始终是个好主意)。
      4. 没有资源泄漏。您的代码永远不会安全地关闭您打开的阅读器。如果您打开资源,请在 try-with-resources 构造中执行此操作,或者将资源存储在字段中并实现 AutoClosable。

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            猜你喜欢
            • 2012-10-07
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-05-04
            • 2011-05-21
            相关资源
            最近更新 更多