为什么我不能从资源中获取文件?
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 (Нет такого файла или каталога)
答案在您的控制台输出中 - 根本找不到文件。
我会尝试使用您编写的相同代码,但使用其中没有空格的文件 - 看看是否仍然找不到该文件。
是:
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.
}
这解决了许多问题:
- 无论您如何 运行 它仍然有效:您的代码段仅在 运行 作为直接 class 文件(相对于,例如,在罐子中)时有效,并且如果涉及空格则不起作用。
- 即使您的 class 是 subclassed 仍然有效(
getClass().getClassLoader().getResource
不会,这就是您不应该这样做的原因)。
- 即使平台本地字符集编码很奇怪,它仍然有效(此答案中的代码段明确说明了这一点。这总是一个好主意)。
- 没有资源泄漏。您的代码永远不会安全地关闭您打开的 reader。如果您打开资源,请在 try-with-resources 构造中这样做,或者将资源存储在字段中并实现 AutoClosable。
我在目录名和文件名中为 _ 更改 space,并且正在工作....我的天啊。
此行存在固有逻辑问题:
CSVReader reader = new CSVReaderBuilder(
new FileReader(resource.getFile()))..
一旦 CSV 成为 Jar 的一部分,它将不再作为 File
对象进行访问。但是像这样的东西应该直接适用于 URL。
CSVReader reader = new CSVReaderBuilder(
new InputStreamReader(resource.openStream()))..
change space for _ in directory name and file name, and working
只有当资源 不是 在 Jar 文件中时才有效。
为什么我无法从资源中获取文件?
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.
}
这解决了许多问题:
- 无论您如何 运行 它仍然有效:您的代码段仅在 运行 作为直接 class 文件(相对于,例如,在罐子中)时有效,并且如果涉及空格则不起作用。
- 即使您的 class 是 subclassed 仍然有效(
getClass().getClassLoader().getResource
不会,这就是您不应该这样做的原因)。 - 即使平台本地字符集编码很奇怪,它仍然有效(此答案中的代码段明确说明了这一点。这总是一个好主意)。
- 没有资源泄漏。您的代码永远不会安全地关闭您打开的 reader。如果您打开资源,请在 try-with-resources 构造中这样做,或者将资源存储在字段中并实现 AutoClosable。
我在目录名和文件名中为 _ 更改 space,并且正在工作....我的天啊。
此行存在固有逻辑问题:
CSVReader reader = new CSVReaderBuilder(
new FileReader(resource.getFile()))..
一旦 CSV 成为 Jar 的一部分,它将不再作为 File
对象进行访问。但是像这样的东西应该直接适用于 URL。
CSVReader reader = new CSVReaderBuilder(
new InputStreamReader(resource.openStream()))..
change space for _ in directory name and file name, and working
只有当资源 不是 在 Jar 文件中时才有效。