序
在java里頭如何獲取硬盤(pán)的序列號(hào)呢,這里涉及了跨平臺(tái)的問(wèn)題,不同的操作系統(tǒng)的查看命令不一樣,那么java里頭如何去適配呢。這里使用了oshi這個(gè)項(xiàng)目來(lái)獲取。
oshi
全稱是Native Operating System and Hardware Information。使用的是jna的方式而不是jni的形式來(lái)進(jìn)行本地調(diào)用的。
jni
JNI(Java Native Interface)是Java語(yǔ)言本身提供的調(diào)用本地已編譯的函數(shù)庫(kù)的方法,本身具有跨平臺(tái)性,可以在不同的機(jī)器上調(diào)用不同的本地庫(kù)。使用JNI調(diào)用.dll/.so共享類庫(kù)我們首先需要另外使用C語(yǔ)言寫(xiě)一個(gè).dll/.so共享庫(kù),使用SUN規(guī)定的數(shù)據(jù)結(jié)構(gòu)替代C語(yǔ)言的數(shù)據(jù)結(jié)構(gòu),調(diào)用已有的dll/so中公布的函數(shù)。然后再在Java中載入這個(gè)適配器dll/so,再編寫(xiě)Java native函數(shù)作為dll中函數(shù)的代理。經(jīng)過(guò)2個(gè)繁瑣的步驟才能在Java中調(diào)用本地代碼。jna
JNA(Java Native Access)框架是一個(gè)開(kāi)源的Java框架,是SUN公司主導(dǎo)開(kāi)發(fā)的,建立在經(jīng)典的JNI的基礎(chǔ)之上的一個(gè)框架。使用JNA,不需要再編寫(xiě)適配用的.dll/.so,只需要在Java中編寫(xiě)一個(gè)接口和一些代碼,作為.dll/.so的代理,就可以在Java程序中調(diào)用dll/so。
maven
<dependency>
<groupId>com.github.oshi</groupId>
<artifactId>oshi-core</artifactId>
<version>3.4.3</version>
</dependency>
獲取方法
SystemInfo si = new SystemInfo();
HardwareAbstractionLayer hal = si.getHardware();
HWDiskStore[] stores = hal.getDiskStores();
Arrays.stream(stores).forEach(e -> {
System.out.println(e.getName() + ":" + e.getSerial());
});