我想访问项目中包中的.wav文件。
例如,我有两个包:
program
sounds
从program/something.class
内部我想玩sounds/asound.wav
。
这怎么可能?
clip.open(AudioSystem.getAudioInputStream(new File(filename)));
clip.start();
//.... something inbetween
clip.stop();
此处filename
为C:\\projects\\something\\sounds\\
,但如何只提供包中asound.wav
的相对路径?
答案 0 :(得分:3)
使用ClassLoader.getResourceAsStream
通过您用于类加载的相同基础架构加载资源。根据类加载器,它可以是目录中的文件,本地JAR文件的内容或远程资源。
getClass().getClassLoader().getResourceAsStream("asound.wav");
如方法名称所示,您将获得资源的InputStream
,而不是文件。如果您认为资源可能是另一个文件的一部分,例如JAR文件,这是有道理的,因为File对象总是指向单个文件,而不是它们的一部分。
答案 1 :(得分:1)
URL url = this.getClass().getResource("/sounds/asound.wav");
当提供给从类中获取的类加载器时,/
前缀将使其从包的“根”进行搜索。
然后查看Java Sound tag Wiki上显示的代码,以便加载Clip
并播放它。
答案 2 :(得分:1)
正如前面提到的here:AudioSystem.getAudioInputStream(InputStream)
的文档说:
这种方法的实施可能 需要多个解析器来检查 流确定他们是否 支持它。这些解析器必须能够 标记流,读取足够的数据 确定他们是否支持 流,如果没有,重置 stream的读指针指向其原始 位置。如果输入流没有 支持这些操作,这种方法 可能因IOException而失败。
因此解决方案将是
clip.open(AudioSystem.getAudioInputStream(
new BufferedInputStream(getClass().getResourceAsStream("/Sounds/asound.wav"))));