package indi.lbw.main;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.Charset;
import java.util.zip.ZipEntry;
import java.util.zip.ZipException;
import java.util.zip.ZipFile;
import java.util.zip.ZipInputStream;
public class Main {
public static void main(String[] args) {
File[] files = getAllFiles();
System.out.println("本次处理文件数:" + files.length);
if (files == null || files.length <= 0) {
System.out.println("没有文件需要处理!");
return;
}
for (int i = 0; i < files.length; i++) {
byte[] bs = getBytes(files[i]);
if (bs == null)
continue;
int version = bytesToInt(bs, 6, 7);
System.out.println("主版本号:"+version);
int version2 = bytesToInt(bs, 4, 5);
System.out.println("次版本号:"+version2);
System.out.println("主版本号对应JDK为:1."+(version-44));
}
}
public static int bytesToInt(byte[] bs, int start, int end) {
int res = 0;
for (int i = start; i <= end; i++) {
res += (bs[i] & 0xFFFF) << ((end - start - (i - start)) * 8);
}
return res;
}
public static File[] getAllFiles() {
String path = System.getProperty("user.dir");
String workPath = path + "\\work";
File workDir = new File(workPath);
if (workDir.exists() && workDir.isDirectory()) {
File[] files = workDir.listFiles();
return files;
}
return null;
}
public static byte[] getBytes(File file) {
byte[] bs = null;
ZipInputStream zin = null;
InputStream classIn = null;
int readLen = 0;
try {
ZipFile zf = new ZipFile(file);
InputStream in = new BufferedInputStream(new FileInputStream(file));
zin = new ZipInputStream(in);
ZipEntry ze = getOneClass(zin);
if (ze == null) {
System.out.println(file.getName() + ".jar包未找到class文件");
return null;
}
classIn = zf.getInputStream(ze);
bs = new byte[8];
readLen = classIn.read(bs);
} catch (Exception e) {
e.printStackTrace();
} finally {
closeIn(zin, classIn);
}
if (readLen < 8) {
return null;
}
return bs;
}
public static ZipEntry getOneClass(ZipInputStream zin) {
ZipEntry ze = null;
try {
while ((ze = zin.getNextEntry()) != null) {
String name = ze.getName();
if (!ze.isDirectory() && name.endsWith(".class")) {
//System.out.println("找到了" + ze.getName());
return ze;
}
}
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
public static void closeIn(ZipInputStream zin, InputStream in) {
if (zin != null) {
try {
zin.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (in != null) {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
被CSDN上的博客坑惨了,一堆博文列出了下面的图片还硬是说CA FE BA BE 占八个字节,然后之后4个字节00 00 是次版本号,次版本号后面的4个字节00 33 是jdk的版本号 ,然后我读取了16个字节,分析12-15的数据,一点都不对,后来仔细看下面的图,明明CA FE BA BE就占4个字节嘛,一个16进制数16种可能,占4位,两个16进制数也就一个字节嘛。只需读取8字节就行,分析第6和第7个byte就行。
下面给出对应关系:
16 10 版本
进 进 版本
制 制 版本
34:52:DK1.8
33:51:JDK1.7
32:50:JDK1.6
31:49:JDK1.5
30:48:JDK1.4
2F:47:JDK1.3