1

我想访问我的项目中一个包中的 .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包中的相对路径呢?

4

3 回答 3

3

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

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

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

于 2012-11-12T10:37:27.943 回答
1
URL url = this.getClass().getResource("/sounds/asound.wav");

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


然后查看Java Sound 标签 Wiki上显示的代码以加载Clip和播放它。

于 2012-11-12T11:01:11.017 回答
1

正如这里也提到的:文档AudioSystem.getAudioInputStream(InputStream)说:

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

因此解决方案将是

clip.open(AudioSystem.getAudioInputStream(
    new BufferedInputStream(getClass().getResourceAsStream("/Sounds/asound.wav"))));
于 2012-11-12T12:28:03.977 回答