【问题标题】:Access files (.wav) in Java package访问 Java 包中的文件 (.wav)
【发布时间】:2012-10-31 18:42:55
【问题描述】:

我想访问我的 .wav 文件,这些文件位于我的项目中的一个包中。

例如我有两个包:

  • program
  • sounds

program/something.class 里面我想玩sounds/asound.wav。 这怎么可能?

clip.open(AudioSystem.getAudioInputStream(new File(filename)));
clip.start();
//.... something inbetween
clip.stop();

这里filenameC:\\projects\\something\\sounds\\,但是怎么可能只给出包中asound.wav 的相对路径呢?

【问题讨论】:

  • 还是不行。出于某种原因,我在getResource 获得了NullPointerException。它在那里,文件存在。

标签: java audio embedded-resource javasound


【解决方案1】:

使用ClassLoader.getResourceAsStream 通过与类加载相同的基础架构加载资源。根据类加载器的不同,这可以是目录中的文件、本地 JAR 文件的内容或远程资源。

getClass().getClassLoader().getResourceAsStream("asound.wav");

如方法名称所示,您将获得资源的InputStream,而不是文件。如果您认为资源可能是另一个文件的一部分,例如 JAR 文件,这是有道理的,因为 File 对象总是指向单个文件,而不是它们的一部分。

【讨论】:

  • getResourceAsStream(..) 通常会因 Java Sound 而失败。它似乎需要一个可以重新定位的InputStream,而从getResourceAsStream(..) 返回的流通常不能。
【解决方案2】:
URL url = this.getClass().getResource("/sounds/asound.wav");

/ 前缀提供给从类中获取的类加载器时,将导致它从包的“根”搜索。


然后查看Java Sound tag Wiki 上显示的代码,用于加载Clip 并播放它。

【讨论】:

    【解决方案3】:

    同样提到hereAudioSystem.getAudioInputStream(InputStream) 的文档说:

    这个方法的实现可能 需要多个解析器来检查 流来确定它们是否 支持它。这些解析器必须能够 标记流,读取足够的数据 来确定他们是否支持 流,如果没有,则重置 流的读取指针指向其原始 位置。如果输入流没有 支持这些操作,这个方法 可能会因 IOException 而失败。

    因此解决方案将是

    clip.open(AudioSystem.getAudioInputStream(
        new BufferedInputStream(getClass().getResourceAsStream("/Sounds/asound.wav"))));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-09
      相关资源
      最近更新 更多