我到处寻找这个,但我似乎无法弄明白。
我正在用Java创建一个使用Midi库的应用程序。为了运行此应用程序,用户必须在lib / audio的JRE安装文件夹中有一个SoundBank文件(soundbank.gm)。我不想让用户自己解决这个问题,所以我希望我可以将soundbank打包为应用程序中的资源,当应用程序启动时,我可以通过编程方式将其移动到正确的目录中不在那里。
首先,我需要知道如何在JAR中打包资源。然后我需要知道如何将资源复制到不同的目录。我知道如何复制普通文件,但我不知道如何能够访问JAR中的文件。
任何帮助将不胜感激。我正在使用eclipse BTW导出Runnable JAR。
编辑:我刚刚弄清楚我的文件没有被打包在JAR中的原因是因为我没有在eclipse中将它声明为源文件夹。现在我如何在Java中访问该文件?我可以简单地将JAR名称视为文件夹名称吗?答案 0 :(得分:2)
为了从Java应用程序访问JAR文件(或类似路径中的任何位置)中打包的资源,您可以使用:
getClass().getResourseasStream("path/to/resource");
如果资源与您的类在同一个包中,您只需要资源名称而不需要任何路径(例如当前目录),如果资源位于不同的包中,您可以使用绝对路径。请参阅Class.getResourseAsStream()的javadoc。获得流后,您可以从中读取,复制它,就像通常使用任何流一样。
答案 1 :(得分:2)
这样做的一种直接方法是将您的java资源作为流访问并将其复制到您想要的位置,例如使用公共IOUtils实用程序类:
InputStream is = MyInstallerClass.class.getResourceAsStream("/path/to/my/resource");
OutputStream os = new FileOutputStream("/path/to/install/directory");
org.apache.commons.io.IOUtils.copy(is,os);
答案 2 :(得分:1)
假设您在您的JAR中的“资源”下面打包soundback.gm。
然后,您可以使用以下内容访问该文件...
ClassLoader cl = this.getClass().getClassLoader();
InputStream is = cl.getResourceAsStream("resources/soundback.gm");
然后您可以通过此...将该InputStream转换为文件...
OutputStream out = new FileOutputStream(new File("/lib/audio/soundback.gm"));
int read = 0;
byte[] bytes = new byte[1024];
while ((read = is.read(bytes)) != -1) {
out.write(bytes, 0, read);
}
is.close();
out.flush();
out.close();