gpt4 book ai didi

java - 运行时访问jar中的库资源

转载 作者:行者123 更新时间:2023-11-30 05:41:14 25 4
gpt4 key购买 nike

我想让一个目录及其所有文件可供方法使用。目录和文件位于

src/main/resources/images

以及运行时的库 jar 内。我正在阅读目录

File directory = new File(getClass().getResource("/images").getFile());

使用

检查 目录的内容
log.info("directory=" + directory.toString());
log.info("directory.isDirectory()=" + directory.isDirectory());
log.info("directory.isFile()=" + directory.isFile());
log.info("directory.canRead()=" + directory.canRead());

给出

  • 目录=文件:/home/leevilux/.m2/repository/groupid/library/1.0-SNAPSHOT/library-1.0-SNAPSHOT.jar!/images
  • directory.isDirectory()=false
  • directory.isFile()=false
  • directory.canRead()=false

很明显它不是一个目录,也不是一个文件,我无法读取。但是 getFile 确实找到了一些东西,因为如果我使用 getResource("/blabla") 代替(它不存在),则会抛出空指针期望( java.lang.NullPointerException).

我是否必须解压 jar 才能创建“正常”路径?如果是这样,怎么办?

最佳答案

是的,您必须提取您想要使用的资源。没有别的办法了。当您知道要使用的确切文件时,这很简单。您只需保存它,然后就可以使用它。

final InputStream directory = Main.class.getResourceAsStream("/images/name.jpg");
final byte[] buffer = new byte[directory.available()];
directory.read(buffer);
final File targetFile = new File("/tmp/target/name.jpg");
final OutputStream outStream = new FileOutputStream(targetFile);
outStream.write(buffer);

当您想要定位目录时,这并不那么容易。您必须检查 jar 中的所有条目并保存所有您想要使用的条目。然后就像上面的情况一样可以使用它们。就像下面的例子一样。

public class UnzipJar {
public static void main(String[] args) throws IOException {
final URL dirURL = UnzipJar.class.getResource("/images");
final String jarPath = dirURL.getPath().substring(5, dirURL.getPath().indexOf("!"));

extract("images", "/tmp/dest", jarPath);
}

public static void extract(final String source, final String destination, String jarPath) throws IOException {
final File file = new File(jarPath);
final JarFile jar = new JarFile(file);
for (final Enumeration<JarEntry> enums = jar.entries(); enums.hasMoreElements(); ) {
final JarEntry entry = enums.nextElement();
final String fileName = destination + File.separator + entry.getName();
final File f = new File(fileName);
if (fileName.startsWith(source) && !fileName.endsWith("/")) {
final InputStream is = jar.getInputStream(entry);
final FileOutputStream fos = new FileOutputStream(f);
while (is.available() > 0) {
fos.write(is.read());
}
fos.close();
is.close();
}
}
}
}

关于java - 运行时访问jar中的库资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55608635/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com