加载资源(声音,图像,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
答案 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中的项目根目录。