簡體   English   中英

為什么我無法從資源中獲取文件?

[英]Why can't I get a file from resources?

為什么我無法從資源中獲取文件?

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

這一行存在一個固有的邏輯問題:

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

一旦 CSV 成為 Jar 的一部分,它將不再可作為File對象訪問。 但是這樣的事情應該直接適用於 URL。

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

更改目錄名和文件名中 _ 的空間,並工作

這僅在資源不在Jar 文件中時有效。

它的:

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。

我在目錄名和文件名中更改了 _ 的空間,然后工作.... omg。

答案在您的控制台輸出中 - 根本找不到該文件。 我會嘗試您編寫的相同代碼,但使用一個沒有空格的文件 - 看看是否仍然找不到該文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM