运行 .jar 时的 getResourceAsStream 文件路径

Posted

技术标签:

【中文标题】运行 .jar 时的 getResourceAsStream 文件路径【英文标题】:getResourceAsStream filepath while running .jar 【发布时间】:2013-04-07 07:02:37 【问题描述】:

我的代码:

BufferedInputStream bis =
  new BufferedInputStream(getClass().getResourceAsStream("playerhit.mp3"));

playerhit.mp3 文件与正在运行的MP3.class 位于同一包中时,此代码可以正常工作。我将其作为.jar 运行。如果我将文件路径更改为/src/data/audio/playerhit.mp3 之类的东西,它就不再起作用了。以 .jar 运行时,是否可以访问与包的根目录不同的文件路径?

【问题讨论】:

在构建过程中playerhit.mp3 是否已复制到您的类路径中?你用什么来构建:Ant、Maven、...? 我不这么认为...而且我正在使用netbeans构建。 您是否使用“data/audio/playerhit.mp3”而不是“playerhit.mp3”? 是的,我确实使用了那个路径 将该路径放入 getResourceAsStream() 会发生什么? 【参考方案1】:

看看Javadoc for getResourceAsStream(...)

如果参数以/ 开头,则资源的绝对名称是/ 后面的名称部分。否则,绝对名称的格式如下: modified_package_name/name 其中modified_package_name 是此对象的包名,其中/ 替换为.

因此,如果您的 playerhit.mp3 位于包结构的根目录中,则应将其引用为 /playerhit.mp3。如果它在/src/data/audio/ 中,您可能应该使用/data/audio/playerhit.mp3 - 但请检查您的JAR 文件的内容以确定。

【讨论】:

它是/data/audio/playerhit.mp3。我尝试使用“/data/audio/”,即使直接从 netbeans 运行也无法正常工作,“./data/audio”在其他情况下也可以工作,但从 .jar 运行时则不行 data 文件夹是否位于 Netbeans 的类路径中? getResourceAsStream() 方法只加载类路径上的资源。 好吧,现在我觉得自己很愚蠢。在将路径用作没有斜杠或点的“data/audio/filename.mp3”之后,我让它工作了。干杯,希望这至少对其他人有所帮助【参考方案2】:

首先检查文件是否真的在 jar 中。

检查罐子内的位置。

相对路径:当前包

绝对路径:jar 的根目录

【讨论】:

以上是关于运行 .jar 时的 getResourceAsStream 文件路径的主要内容,如果未能解决你的问题,请参考以下文章

Linux - 通过 shell 脚本运行 jar 文件时的 IO 异常

在 intellij 中运行并执行 jar 时的细微差异

IntelliJ IDEA打可运行jar包时的错误

读取properties文件方式

(J2ME) 如何在我的 jar 应用程序中获取文件/资源​​列表

运行使用 SBT 和 ProGuard 构建的独立 jar 时出现 AbstractMethodError