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()。