首先,我使用读取器和从包到文件位置的相对文件路径加载它。代码如下:
IdLoader.class.getClassLoader().getResource("ids.csv");
通过了本地单元测试加载。然而,当运行它时,代码会构建到 JAR 文件中,并且总是给我一个找不到文件的错误。后来我改用另一种方法:
public static final InputStream CSV_FILE_INPUT_STREAM =
IdLoader.class.getClassLoader().getResourceAsStream("ids.csv");
构建后,这会使代码通过并在运行时加载 ids。导致第一种方法通过而第二种方法失败的两种方法之间有什么区别?
一旦通过测试并且构建了 JAR,您的资源路径 URL 就会指向 JAR 的内容,例如“myapp.jar!data/file.csv”,不幸的是,这不是文件读取器打开的有效路径。
因此,对于 JAR 的内容,您要么需要使用 Classloader 的 getResourceAsStream 方法,要么使用 JAR 归档器打开 JAR(它是内部 zip 压缩),然后您可以使用解压缩器从那里加载文件。