我在读取从 Eclipse 项目导出的导出 jar 文件中的文件时遇到问题。我想在命令行上运行我的应用程序时,或者在 Eclipse 中运行相同的应用程序时访问相同的文件,并让它通过 Eclipse 内的源层次结构(即不通过 Jar 文件)访问相同的文件。
在我的 Java 项目中,我有一个名为:SoundDir 的文件夹,其中有一个名为:sonar-beep.wav 的声音文件。这是我访问时遇到问题的文件。
这是我尝试用来访问声音文件的代码行:
InputStream input = getClass().getResourceAsStream("SoundDir/sonar-beep.wav");
当我在 Eclipse 调试器中运行程序时,输入始终返回为 Null。我认为它没有找到该文件。
有什么问题的想法吗?
现在,如果这确实有效,我想使用 inputStream 作为 Java SoundPlayer 的参数来播放此数据文件中的音乐。我可以直接提供“输入”作为参数,还是需要在其之上添加 BufferedReader 或其他对象?
AudioInputStream audioIn1= AudioSystem.getAudioInputStream(input);
如果有任何帮助,我们将不胜感激!所有这些类加载器问题都是新的。
谢谢。
<小时/>好的,现在这个问题已经解决了。请参阅 Robert 提供的以下解决方案,该解决方案对图像文件也有同样的问题。我希望我的程序能够找到它们,无论应用程序是在 Eclipse 中运行,还是在命令行上运行。
代码如下: ImageIcon imageIcon= new ImageIcon(getImageURL("/ImageAirplanes/AirplaneRtoL.png"));
这是 getImageURL 方法:
public URL getImageURL(String imageFilename) {
URL aURL= null;
ClassLoader cl = this.getClass().getClassLoader();
aURL= cl.getResource(imageFilename);
return aURL;
}
在 Eclipse 中运行程序时,我不断收到 aURL 的空值。 我确实有 ImageAirplanes 的父目录(即“Resources”),已添加到我的项目的 Java 构建路径中。
有什么想法吗?谢谢。
最佳答案
您的 SoundDir 目录位于 JAR 文件中的什么位置?试试unpacking the JAR file并检查您是否不确定。
如果您的 SoundDir 目录位于 JAR 目录的紧邻位置,那么它是相对于 JAR 根目录的,您需要使用 /SoundDir/sonar-beep.wav
-注意前导斜杠。这使得路径绝对,或相对于根
如果没有斜杠,您将指定一个相对路径,它相对于类加载器 - 加载与返回的类包含在同一包中的资源getClass()
.
为了更深入地理解,了解File System paths是有帮助的。
关于java - 需要帮助访问 Jar 文件中的数据文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26995767/