【问题标题】:Need help accessing data file in Jar File需要帮助访问 Jar 文件中的数据文件
【发布时间】: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 文件中。你知道如何解决这个问题吗?

标签: java eclipse audio


【解决方案1】:

您的 SoundDir 目录在 JAR 文件中的什么位置?试试unpacking the JAR file 看看你是否不确定。

如果您的 SoundDir 目录位于 JAR'd 目录的内部,那么它是相对于 JAR 根目录的,您需要使用 /SoundDir/sonar-beep.wav - 注意前导斜杠。这使得路径绝对,或相对于根

如果没有斜线,您将指定一个相对路径,它相对于类加载器 - 加载包含在与返回的类相同的包中的资源getClass().

要更深入了解,了解File System paths会有帮助

【讨论】:

  • 嗨罗伯特,请参阅上面的评论。现在试图让上面的指令在 Eclipse 中工作(即它没有访问 Jar 文件)。我这样做对吗?获取空指针异常。
  • 嗨罗伯特,你的建议奏效了。但是对如何从 Eclipse 导出的 Jar 文件中的目录中创建声音文件有疑问。他们的父目录现在从导出的 Jar 文件中消失了。请参阅我上面的评论。感谢您的帮助!
  • 最简单的解决方案是创建一个子包。我建议将现有的SoundDir 源文件夹 重命名为resources,并创建一个名为SoundDir 的包inside resources。请确保将您的路径适当地更新为/SoundDir/sonar-beep.wav。
  • 嗨罗伯特,我的图像文件也有同样的问题。我编辑了我的原始帖子以反映这一点。我发布了代码。你能复习一下看看有什么问题吗?非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-12
  • 1970-01-01
  • 1970-01-01
  • 2019-11-07
  • 2013-07-31
  • 1970-01-01
相关资源
最近更新 更多