序
在java里頭如何獲取硬盤的序列號呢,這里涉及了跨平臺的問題,不同的操作系統的查看命令不一樣,那么java里頭如何去適配呢。這里使用了oshi這個項目來獲取。
oshi
全稱是Native Operating System and Hardware Information。使用的是jna的方式而不是jni的形式來進行本地調用的。
jni
JNI(Java Native Interface)是Java語言本身提供的調用本地已編譯的函數庫的方法,本身具有跨平臺性,可以在不同的機器上調用不同的本地庫。使用JNI調用.dll/.so共享類庫我們首先需要另外使用C語言寫一個.dll/.so共享庫,使用SUN規定的數據結構替代C語言的數據結構,調用已有的dll/so中公布的函數。然后再在Java中載入這個適配器dll/so,再編寫Java native函數作為dll中函數的代理。經過2個繁瑣的步驟才能在Java中調用本地代碼。jna
JNA(Java Native Access)框架是一個開源的Java框架,是SUN公司主導開發的,建立在經典的JNI的基礎之上的一個框架。使用JNA,不需要再編寫適配用的.dll/.so,只需要在Java中編寫一個接口和一些代碼,作為.dll/.so的代理,就可以在Java程序中調用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());
});