从 JAR 的角度来看,java 文件管理器加载器和输入流读取器有什么区别

问题描述 投票:0回答:1
我需要在 cron 作业上加载 CSV 文件,该文件包含 ids 列表。位于资源文件夹中。

首先,我使用读取器和从包到文件位置的相对文件路径加载它。代码如下:

IdLoader.class.getClassLoader().getResource("ids.csv");
通过了本地单元测试加载。然而,当运行它时,代码会构建到 JAR 文件中,并且总是给我一个找不到文件的错误。

后来我改用另一种方法:

public static final InputStream CSV_FILE_INPUT_STREAM = IdLoader.class.getClassLoader().getResourceAsStream("ids.csv");
构建后,这会使代码通过并在运行时加载 ids。

导致第一种方法通过而第二种方法失败的两种方法之间有什么区别?

java csv inputstream
1个回答
0
投票
在单元测试阶段,JAR 中没有文件,因此资源路径是有效的 URL,您可以打开此类文件。那是因为当测试未通过时构建 JAR 是没有意义的。

一旦通过测试并且构建了 JAR,您的资源路径 URL 就会指向 JAR 的内容,例如“myapp.jar!data/file.csv”,不幸的是,这不是文件读取器打开的有效路径。

因此,对于 JAR 的内容,您要么需要使用 Classloader 的 getResourceAsStream 方法,要么使用 JAR 归档器打开 JAR(它是内部 zip 压缩),然后您可以使用解压缩器从那里加载文件。

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