思路:输入一个jar文件,或者一个包含jar文件的目录。然后读取jar包中的class文件,并读取其第7个字节,则为编译的JDK版本号。
package io;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.Enumeration;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
/**
* Jar文件的编译版本统计。
*/
public class JarReader {
public static void main(String[] args) throws IOException {
String file = null;
if (args.length == 0) {
file = "any_name.jar";
} else {
file = args[0];
}
parseCommandLine(file);
}
public static void parseCommandLine(String input) throws IOException {
File file = new File(input);
if (file.isFile()) {
parseJar(file);
} else if (file.isDirectory()) {
for (File tmpFile : file.listFiles()) {
parseJar(tmpFile);
}
}
}
public static void parseJar(File file) throws IOException {
if(!file.getName().endsWith(".jar")){
return;
}
try (JarFile jarFile = new JarFile(file)){
Enumeration<JarEntry> entries = jarFile.entries();
byte[] buf = new byte[8];
while (entries.hasMoreElements()) {
JarEntry entry = entries.nextElement();
if (entry.getName().endsWith(".class")) {
try (InputStream is = jarFile.getInputStream(entry)) {
is.read(buf);
}
break;
}
}
// 字节码文件中,第7个字节表示主版本号
byte majorVersion = buf[7];
System.out.println(file.getName() + "\t " + convertVesion(majorVersion));
}
}
public static String convertVesion(byte majorVersion) {
int version = majorVersion - 44;
if(version < 5) {
return "JDK_1." + version;
} else {
return "JDK_" + version;
}
}
}