如何从jar包、maven依赖中读取资源文件

394 阅读1分钟

仅以此篇纪念被吕诗文甩一个月,纪念2022年七夕

我们通过常规手段读取资源文件只能获取到文件夹也就是module下的资源文件,有时候我们会需要去获取jar包中的资源文件。当你认真阅读此篇说明你也遇到了这个问题。

不说废话上代码,目标是打印出META-INF/coke.abc的内容

package org.needcoke;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;
import java.util.Enumeration;
import java.util.List;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
import java.util.stream.Collectors;

public class Main {

    public static void main(String[] args) throws IOException {
        String property = System.getProperty("java.class.path");   //获取引用的所有class目录,包含了jar包
        String[] paths = property.split(";");
        List<String> jarPaths = Arrays.stream(paths).filter(i -> i.endsWith(".jar") && new File(i).isFile()).collect(Collectors.toList());
        List<String> dirPaths = Arrays.stream(paths).filter(i -> new File(i).isDirectory()).collect(Collectors.toList());
        for (String jarPath : jarPaths) {
            JarFile jarFile = new JarFile(jarPath);
            Enumeration<JarEntry> entries = jarFile.entries();
            while (entries.hasMoreElements()) {
                JarEntry jarEntry = entries.nextElement();
                String name = jarEntry.getName();
                if (name.charAt(0) == '/') {
                    name = name.substring(1);
                }
                if (name.equals("META-INF/coke.abc")) {
                    InputStream inputStream = jarFile.getInputStream(jarEntry);
                    byte[] b = new byte[2048];
                    int c = 0;
                    String str = "";
                    while((c = inputStream.read(b)) != -1){
                        str += new String(b,0,c);
                    }
                    System.out.println(str);
                }


            }

        }
    }
}