参考:
demo用的这个的,jar包也是,也可以从网上自己下载。
这里记录下自己遇到的坑。
最终的项目结构,和原作者的差不多,这里只获取盘符信息。
创建项目的时候也别需要注意:
到底选择是jdk还是jre,不过最终都要拷贝dll文件到bin目录下面,这里工具类就是SigarUtils.java
jdk:
jre:
SigarUtils.java
部署到正式项目中,其实只需要执行一次,初始化的时候执行。bin目录中拷贝以后就可以了。
特别注意:这里区分了不同的系统,不同的系统位数。考虑的相当全面了!!!
Windows:将sigar.jar包放到classpath下,将sigar-amd64-winnt.dll放到环境变量java.library.path下。
Linux:将sigar.jar包放到classpath下,将libsigar-x86-linux.so放到环境变量java.library.path下。
public class SigarUtils {
/**
* 使代码生效需要把一些对应的批处理文件放到java的bin目录下,也就是jdk的bin目录下,不能手动添加,并且分别考虑win和linux系统。
*
* Windows:将sigar.jar包放到classpath下,将sigar-amd64-winnt.dll放到环境变量java.library.path下。
Linux:将sigar.jar包放到classpath下,将libsigar-x86-linux.so放到环境变量java.library.path下。
*
*/
private final static String WINDOWS64 = "\\sigar-amd64-winnt.dll";
private final static String WINDOWS32 = "\\sigar-x86-winnt.dll";
private final static String LINUX32 = "\\libsigar-x86-linux.so";
private final static String LINUX64 = "\\libsigar-amd64-linux.so";
/**
* 获取操作系统类型
*
* @return
*/
public static String getOsType() {
String osName = System.getProperty("os.name");
if (!isNull(osName)) {
System.out.println("osName:" + osName);
String sysName = "";
if (osName.toLowerCase().startsWith("windows") || osName.toLowerCase().startsWith("win")) {
sysName = "windows";
} else if (osName.toLowerCase().startsWith("linux")) {
sysName = "linux";
}
return sysName;
}
return "UnknownSys";
}
//操作系统+单位数
public static String getSysBit() {
String systemtype = getOsType(); // 获取操作系统类型
if (systemtype.equalsIgnoreCase("windows")) { // 检测到系统为Windows系统
String arch = System.getenv("PROCESSOR_ARCHITECTURE");
String wow64Arch = System.getenv("PROCESSOR_ARCHITEW6432");
if (arch.endsWith("64") || wow64Arch != null && wow64Arch.endsWith("64")) {
return systemtype + " 64";
} else {
return systemtype + " 32";
}
} else if (systemtype.equalsIgnoreCase("linux")) { // 检测到系统为Linux系统
try {
Process process = Runtime.getRuntime().exec("getconf LONG_BIT");
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
String s = bufferedReader.readLine();
if (s.contains("64")) {
return systemtype + " 64";
} else {
return systemtype + " 32";
}
} catch (IOException e) {
return systemtype + " UnknownBit";
}
}
return systemtype + " UnknownBit";
}
/**
* 判断对象是否为空
*
* @param obj
* @return
*/
public static boolean isNull(Object obj) {
if (obj instanceof String)
return obj == null || "".equals(obj);
if (obj instanceof Collection)
return ((Collection) obj).size() <= 0;
if (obj instanceof Map)
return ((Map) obj).size() <= 0;
return obj == null;
}
public static String getJavaBinPath() {
String libraryPath = System.getProperty("java.library.path");
return libraryPath.substring(0, libraryPath.indexOf(";"));
}
public static String getUsrDirPath() {
return System.getProperty("user.dir") + "\\sigar-dll";
}
private static void copyFile(String source, String dest) {
copyFile(new File(source), new File(dest));
}
private static void copyFile(File source, File dest) {
FileChannel inputChannel = null;
FileChannel outputChannel = null;
try {
try {
inputChannel = new FileInputStream(source).getChannel();
outputChannel = new FileOutputStream(dest).getChannel();
outputChannel.transferFrom(inputChannel, 0, inputChannel.size());
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
} finally {
try {
inputChannel.close();
outputChannel.close();
} catch (IOException e) {
System.out.println("无该目录访问权限,请手动拷贝" + dest);
e.printStackTrace();
}
}
}
public static void chooseFile() {
String system = getSysBit();
String srcFile = getUsrDirPath();
String descFile = getJavaBinPath();
// windows操作系统单位数未知
if (system.indexOf("windows") != -1 && system.indexOf("UnknownBit") == -1) {
copyFile(srcFile + WINDOWS64, descFile + WINDOWS64);
copyFile(srcFile + WINDOWS32, descFile + WINDOWS32);
return;
}
if (system.indexOf("windows") != -1 && system.endsWith("32")) {
copyFile(srcFile + WINDOWS32, descFile + WINDOWS32);
} else {
copyFile(srcFile + WINDOWS64, descFile + WINDOWS64);
}
if (system.indexOf("linux") != -1 && system.indexOf("UnknownBit") == -1) {
copyFile(srcFile + LINUX64, descFile + LINUX64);
copyFile(srcFile + LINUX32, descFile + LINUX32);
return;
}
if (system.indexOf("linux") != -1 && system.endsWith("32")) {
copyFile(srcFile + LINUX32, descFile + LINUX32);
} else {
copyFile(srcFile + LINUX64, descFile + LINUX64);
}
if (system.indexOf("UnknownSys") != -1) {
System.out.println("==================未知操作系统,请手动选择命令文件!=================");
}
}
public static void main(String[] args) {
//拷贝dll文件到jdk(执行一次)
// chooseFile();
System.out.println(System.getProperty("java.library.path"));
System.out.println("getSysBit:" + getSysBit());
System.out.println("getJavaBinPath:" + getJavaBinPath());
}
}
RuntimeUtils.java
主要类,通过调用dll,获取系统盘符信息。
public class RuntimeUtils {
public static void main(String[] args) {
try {
//文件系统信息
System.out.println(getDiskInfo()[0].toString());
} catch (Exception el) {
el.printStackTrace();
}
}
public static DiskInfo[] getDiskInfo() throws Exception{
Sigar sigar = new Sigar();
FileSystem fslist[] = sigar.getFileSystemList(); //分区
DiskInfo[] diskInfos = new DiskInfo[fslist.length];
for (int i = 0; i < fslist.length; i++) {
System.out.println("分区的盘符名称" + i);
DiskInfo diskInfo = new DiskInfo();
FileSystem fs = fslist[i];
// 分区的盘符名称
diskInfo.setDiskName(fs.getDevName());
// 分区的盘符类型
diskInfo.setDiskType(fs.getSysTypeName());
FileSystemUsage usage = null;
usage = sigar.getFileSystemUsage(fs.getDirName());
switch (fs.getType()) {
case 0: // TYPE_UNKNOWN :未知
break;
case 1: // TYPE_NONE
break;
case 2: // TYPE_LOCAL_DISK : 本地硬盘
// 文件系统总大小
diskInfo.setTotalDisk(usage.getTotal()/1024); //单位 M
System.out.println(fs.getDevName() + "总大小: "
+ usage.getTotal() + "KB");
// 文件系统剩余大小
diskInfo.setFreeDisk(usage.getFree()/1024);
//System.out.println(fs.getDevName() + "剩余大小: "+ usage.getFree() + "KB");
// 文件系统已经使用量
//System.out.println(fs.getDevName() + "已经使用量: "+ usage.getUsed() + "KB");
double usePercent = usage.getUsePercent() * 100D;
diskInfo.setResUseAge(usePercent+ "%");
// 文件系统资源的利用率
System.out.println(fs.getDevName() + "资源的利用率: " + usePercent+ "%");
break;
case 3:// TYPE_NETWORK :网络
break;
case 4:// TYPE_RAM_DISK :闪存
break;
case 5:// TYPE_CDROM :光驱
break;
case 6:// TYPE_SWAP :页面交换
break;
}
diskInfo.setReadDisk(usage.getDiskReads());
diskInfo.setWriteDisk(usage.getDiskWrites());
diskInfos[i] = diskInfo;
//System.out.println(fs.getDevName() + "读出: "+ usage.getDiskReads());
//System.out.println(fs.getDevName() + "写入: "+ usage.getDiskWrites());
}
return diskInfos;
}
}
DiskInfo.java
封装盘符信息的实体类,方便数据传递。
/**
* 磁盘信息
*/
public class DiskInfo {
private String diskName;
private String diskType;
private long totalDisk;
private long freeDisk;
private long useDisk;
private String resUseAge;
private long readDisk;
private long writeDisk;
public String getDiskName() {
return diskName;
}
public void setDiskName(String diskName) {
this.diskName = diskName;
}
public String getDiskType() {
return diskType;
}
public void setDiskType(String diskType) {
this.diskType = diskType;
}
public long getTotalDisk() {
return totalDisk;
}
public void setTotalDisk(long totalDisk) {
this.totalDisk = totalDisk;
}
public long getFreeDisk() {
return freeDisk;
}
public void setFreeDisk(long freeDisk) {
this.freeDisk = freeDisk;
}
public long getUseDisk() {
return useDisk;
}
public void setUseDisk(long useDisk) {
this.useDisk = useDisk;
}
public String getResUseAge() {
return resUseAge;
}
public void setResUseAge(String resUseAge) {
this.resUseAge = resUseAge;
}
public long getReadDisk() {
return readDisk;
}
public void setReadDisk(long readDisk) {
this.readDisk = readDisk;
}
public long getWriteDisk() {
return writeDisk;
}
public void setWriteDisk(long writeDisk) {
this.writeDisk = writeDisk;
}
@Override
public String toString() {
return "DiskInfo [diskName=" + diskName + ", diskType=" + diskType
+ ", totalDisk=" + totalDisk + ", freeDisk=" + freeDisk
+ ", useDisk=" + useDisk + ", resUseAge=" + resUseAge
+ ", readDisk=" + readDisk + ", writeDisk=" + writeDisk + "]";
}
}