【发布时间】:2015-01-15 17:27:00
【问题描述】:
我无法读取我从 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 的父目录(即“资源”)添加到我的项目的 Java 构建路径中。
有什么想法吗?谢谢。
【问题讨论】:
-
了解 JAR 的文件结构很重要。如果你解压它,SoundDir 是在根目录吗?在这种情况下,您需要
/SoundDir/sonar-beep.wav- 注意前导斜杠。没有斜线,资源是相对于getClass()返回的类加载的(即同一个包) -
@Roberto:回答这个问题,因为这似乎是解决方案。另请注意,路径名必须区分大小写(与 Windows 下的文件路径相反)。
-
嗨罗伯特,SoundDir 位于根目录。它位于我项目的顶层。它不在任何包装下。但是,现在我正试图让代码在从 Eclipse 中运行我的程序时工作。我仍然得到一个空回。它抛出空指针异常。我尝试在 SoundDir 前面放置一个前导斜杠,没有,在每种情况下它都会抛出一个空指针异常。
-
在这种情况下,可能是因为目录不在构建路径上。将 SoundDir 转换为源文件夹(项目 -> 属性 -> Java -> 构建路径 -> 源文件夹 -> 添加文件夹)。然后将“/SoundDir/sonar-beep.wav”更改为“/sonar-beep.wav”
-
您好,罗伯托,成功了!谢谢!但是,因此有另一个问题。我试图访问的声音文件存储在我的 Eclipse 项目中的文件夹中。当我将项目导出为 Jar 文件(这样我可以在命令行上运行程序)时,我看到声音文件位于 Jar 文件的顶层。它们不包含在任何文件夹中。我在 Eclipse 项目中存储它们的文件夹不是在导出的 Jar 文件中创建的。真的希望它们的包含文件夹存在于导出的 Jar 文件中。你知道如何解决这个问题吗?