在运行.jar文件时,如何使用getResourceAsStream获取文件路径?

13

我的代码:

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

playerhit.mp3 文件与正在运行的 MP3.class 位于同一个包中时,此代码可以正常运行。我正在以.jar的形式运行此代码。但是,如果我将文件路径更改为 /src/data/audio/playerhit.mp3 之类的内容,则不再起作用。在以.jar的形式运行时,是否有任何方式可以访问不同于包根目录的文件路径?


在构建过程中,playerhit.mp3 是否被复制到了你的类路径中?你使用什么工具进行构建:Ant、Maven 还是其他? - user1907906
我不这么认为...我正在使用NetBeans进行构建。 - user2281673
你是否使用了"data/audio/playerhit.mp3"而不是"playerhit.mp3"? - AllTooSir
是的,我确实使用了那个路径。 - user2281673
当您将该路径放入getResourceAsStream()中时会发生什么? - AllTooSir
它在 NetBeans 中可以工作,但在运行 .jar 文件时无法正常工作。 - user2281673
2个回答

10

请查看获取 getResourceAsStream(...) 的 Javadoc

如果参数以 / 开头,则资源的绝对名称为该名称后面的部分。否则,绝对名称的格式如下: 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 时却不行。 - user2281673
你在Netbeans中的类路径上是否有data文件夹?getResourceAsStream()方法只会加载在类路径上的资源。 - mthmulders
1
现在我感觉很蠢。在没有斜杠或点的情况下,只使用路径"data/audio/filename.mp3",我终于让它工作了。谢谢大家,希望这至少能帮助其他人。 - user2281673

0

首先检查文件是否实际上在JAR包中。

检查JAR包内的位置。

相对路径:当前包

绝对路径:JAR包的根目录


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接