在运行时访问jar中的库资源

问题描述 投票:1回答:1

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

SRC /主/资源/图片

并在运行时在库jar中。我正在阅读目录

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

检查directory的内容

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 /图片
  • directory.isDirectory()=假
  • directory.isFile()=假
  • directory.canRead()=假

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

我是否必须提取jar以创建“正常”路径?如果是这样,怎么样?

java file jar
1个回答
1
投票

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

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();
            }
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.