Java InputStream 无法从 JAR 中读取文件

Posted

技术标签:

【中文标题】Java InputStream 无法从 JAR 中读取文件【英文标题】:Java InputStream fails to read file from within JAR 【发布时间】:2013-02-20 07:19:17 【问题描述】:

我正在尝试从我的可执行 .jar 文件中读取一个文件,但它不断得到空值。

我有这个代码:

public DanceEventTicketScanner(String txtfile)
    sv = new ScannerView(this);
    findcode = false;
    InputStream is = this.getClass().getResourceAsStream("/resources/copy.csv");
    if (is == null) JOptionPane.showMessageDialog(null, "Resource not located.");

在 JAR 文件中,我(正常)有一个文件夹,其中包含我的所有 .class 文件,并且在同一目录中有一个名为 resources 的文件夹,其中包含 copy.csv 文件。

但此代码无法识别该文件。

有人有什么想法吗?

【问题讨论】:

相关问题:***.com/questions/3369794/… 和什么在同一个目录下? /resources 需要位于 JAR 文件的根目录中,您的代码才能正常工作。 【参考方案1】:

去掉第一个斜杠:

InputStream is = this.getClass().getResourceAsStream("resources/copy.csv");

【讨论】:

【参考方案2】:

getClass().getResourceAsStream(..) 将使用相对于类的路径(因此包括包目录)。 getClass().getClassLoader().getResourceAsStream(..) 将使用绝对路径。因此,更改您的代码并获取类加载器,它就会工作。

【讨论】:

所以如果我使用你说的第二个,我仍然只是给“/resources/copy.csv”作为参数吗? 这个答案不正确。请参阅 Javadoc。如果指定了绝对路径,它将使用它。

以上是关于Java InputStream 无法从 JAR 中读取文件的主要内容,如果未能解决你的问题,请参考以下文章

当 jar 文件从 URL 作为 InputStream 打开时,JarEntry.getSize() 返回 -1

从 Java 中的 InputStream 加载 SQLite 作为 ReadOnly

当我尝试让 InputStream 与 jar Java Sound API 中的文件连接时出现 IO 异常

java 获取Jar文件中的资源(不直接获取InputStream)是很棘手的。这是做到这一点的方法:toExternalForm()。

从 getInputStream 正确关闭 Java Process InputStream

如何在java中识别InputStream的结束