最近遇到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; }}