仅以此篇纪念被吕诗文甩一个月,纪念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);
}
}
}
}
}