我正在编写一个需要从其资源目录中复制一些静态资产的应用程序。目录结构是这样的;
java/
resources/
assets/
file1.txt
file2.txt
subdir/
file3.txt
我想将 assets 目录(递归地)复制到文件系统上的某个位置。如果我使用IOUtils.copy(InputStream in, OutputStream out)
,那么我会得到一个空指针异常。
InputStream in = getClass().getResourceAsStream("/assets");
OutputStream out = new FileOutputStream(new File("/path/to/write/to"));
IOUtils.copy(in, out);
Exception in thread "main" java.lang.NullPointerException
at java.io.FilterInputStream.read(FilterInputStream.java:133)
at java.io.FilterInputStream.read(FilterInputStream.java:107)
at org.apache.commons.io.IOUtils.copyLarge(IOUtils.java:2146)
at org.apache.commons.io.IOUtils.copy(IOUtils.java:2102)
at org.apache.commons.io.IOUtils.copyLarge(IOUtils.java:2123)
at org.apache.commons.io.IOUtils.copy(IOUtils.java:2078)
但是,如果我更改输入和输出流,使它们是文件而不是目录,那么它可以正常复制。
有没有办法以递归方式将作为jar一部分的目录复制到文件系统?
答案 0 :(得分:1)
将所有资产文件放入一个zip文件中,如Reddymails链接的问题所述,这是一个非常好的方法。
如果您想将资产文件保存为.jar中的单个条目,问题是您将没有要列出的目录:
在打包之前,您可以让您的构建过程列出文本文件中的条目(因为您知道它们是什么),并将该文本文件包含在.jar中。然后在运行时复制它们就像从该文件中读取一样简单:
Path assetDir = /* ... */;
try (BufferedReader listFile = new BufferedReader(
new InputStreamReader(
getClass().getResourceAsStream("assets-list.txt"),
StandardCharsets.UTF_8))) {
String assetResource;
while ((assetResource = listFile.readLine()) != null) {
Path assetFile = assetDir.resolve(assetResource);
Files.createDirectories(assetFile.getParent());
try (InputStream asset = getClass().getResourceAsStream(assetResource)) {
Files.copy(asset, assetFile);
}
}
}
答案 1 :(得分:0)
万一有人还在寻找它,我刚刚共享了一个类,它确实做到了这一点:将资源目录复制到文件系统中的目标位置。可以在这里找到:https://stackoverflow.com/a/58318009/738968