在 jar 中加载资源文件

Loading resource files within a jar

加载资源(声音、图像、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

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

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

ClassLoaderclass有两个相关方法:

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

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


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

这段代码对我有用:

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/ 文件夹添加到 class 路径。

关键变化正在将 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());

return

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

分别

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