在jar

时间:2015-05-17 02:45:20

标签: java jar io loading

加载资源(声音,图像,xml数据)的最佳方式是什么,这也可以在分布式jar文件中运行?

我需要加载一些声音,图像和xml数据,以便在我的程序中使用。使用

AudioInputStream ais = AudioSystem.getAudioInputStream(new File("~/src/com/example/package/name/assets/TestSound.wav"));
由于显而易见的原因,

在jar中不起作用,包括src不在jar中的事实。

修改

(工作)MWE:http://pastebin.com/CNq6zgPw

3 个答案:

答案 0 :(得分:2)

ClassLoader类有两个相关的方法:

  • getResource(path)为类路径上的任何资源提供URL
  • getResourceAsStream(path)为资源提供输入流。

您可以将这些方法与AudioSystem.getAudioInputStream(...)方法的重载一起使用,以获取读取JAR文件中资源的音频流。

请注意,如果在ClassLoader对象上调用这些方法,那么这些路径将在类路径上的JAR文件的名称空间中解析...而不是开发平台的文件系统名称空间。

答案 1 :(得分:1)

您可以使用jar或jar外部的代码加载任何资源:

InputStream is = this.getClass().getClassLoader().getResourceAsStream("~/src/package/name/assets/TestSound.wav");

答案 2 :(得分:0)

这段代码对我有用:

Clip clip = null;
ClassLoader cl = this.getClass().getClassLoader();
AudioInputStream ais;
URL url = cl.getResource("com/example/project/assets/TestSound.wav");
System.out.println(url);
try {
    ais = AudioSystem.getAudioInputStream(url);
clip = AudioSystem.getClip();
clip.open(ais);
}
catch (Exception e) {
    e.printStackTrace();
    System.exit(1);
}

重要的是不要将/src/文件夹添加到类路径中。

关键更改正在将cl.getResource("/com/example/project/assets/TestSound.wav")更改为cl.getResource("com/example/project/assets/TestSound.wav"); 因为/com/...表示路径是绝对的,而com/...表示路径是相对的。

例如,

System.out.println(new File("/Test.File").getAbsolutePath());
System.out.println(new File("Test.File").getAbsolutePath());

返回

/Test.File
/Users/alphadelta/Documents/Workspace/TestProject/Test.File

分别

创建的第一个文件是使用"/Test.File"创建的,这是绝对的。第二个是使用"Test.File"创建的,它相对于eclipse中的项目根目录。