在 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");
ClassLoader
class有两个相关方法:
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 中的项目根目录的。
加载资源(声音、图像、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");
ClassLoader
class有两个相关方法:
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 中的项目根目录的。