最近遇到java获取DLL文件版本的问题,本来想通过JNI直接调用C++获取版本号,但是程序运行环境部是在windows下面,会导致迁移到LINUX下也无法运行,后来在网上找了很久也没发现问题解决方案,索性就自己研究了下DLL文件内部,代码如下:
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
public class T {
public static void main(String[] args) throws Exception{
String filePath = "C:\\WINDOWS\\twain_32.dll";
File file = new File(filePath);
BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
String s = "F i l e V e r s i o n";
byte[] b = s.getBytes();
for (int i = 0; i < b.length; i++) {
if(b[i] == 32){
b[i] = 0;
}
}
String str = new String(b);
byte[] data = null;
while(reader.ready()){
String line = reader.readLine();
int index = line.indexOf(str);
if(index > 0){
int len = index + str.length() + 5;
String sb = line.substring(len,len+16);
data = sb.getBytes();
break;
}
}
int version1 = getVersion(data, 0, 1);
int version2 = getVersion(data, 3, 5);
int version3 = getVersion(data, 7, 9);
int version4 = getVersion(data, 11, 15);
String version = version1 + "." + version2 + "." + version3 + "." + version4;
System.out.println(version);
System.out.println(new String(data));
}
public static int getVersion(byte[] data,int start,int end){
int version = 0;
int len = end-start;
byte[] d = new byte[len];
for (int i = start,j=0; i < end; i++,j++) {
d[j] = data[i];
}
version = Integer.parseInt(new String(d).trim());
return version;
}
}
转载于:https://blog.51cto.com/hyssmt/1280282