在要获取计算机的一些基本信息时,让Java开发人员感觉无所适从,总觉得不好做,因为大家的第一反应可能是动态链接库,使用JNI或JNA来实现,但是求人不如求己,所以就简单的写了一个例子,实现的功能也很简单,只是玩玩。。。。
好啦,先写好bean或者说实体类吧
/** * @Description: * * @Title: MonitorInfoBean.java * @Package com.joyce.bean * @Copyright: Copyright (c) 2014 * * @author Comsys-LZP * @date 2014-4-24 上午11:07:59 * @version V2.0 */ package com.joyce.bean; /** * @Description: * * @ClassName: MonitorInfoBean * @Copyright: Copyright (c) 2014 * * @author Comsys-LZP * @date 2014-4-24 上午11:07:59 * @version V2.0 */ public class MonitorInfoBean { /** 可使用内存. */ private long totalMemory; /** 剩余内存. */ private long freeMemory; /** 最大可使用内存. */ private long maxMemory; /** 操作系统. */ private String osName; /** 总的物理内存. */ private long totalMemorySize; /** 剩余的物理内存. */ private long freePhysicalMemorySize; /** 已使用的物理内存. */ private long usedMemory; /** 线程总数. */ private int totalThread; /** cpu使用率. */ private double cpuRatio; /** * @return the totalMemory */ public long getTotalMemory() { return totalMemory; } /** * @param totalMemory * the totalMemory to set */ public void setTotalMemory(long totalMemory) { this.totalMemory = totalMemory; } /** * @return the freeMemory */ public long getFreeMemory() { return freeMemory; } /** * @param freeMemory * the freeMemory to set */ public void setFreeMemory(long freeMemory) { this.freeMemory = freeMemory; } /** * @return the maxMemory */ public long getMaxMemory() { return maxMemory; } /** * @param maxMemory * the maxMemory to set */ public void setMaxMemory(long maxMemory) { this.maxMemory = maxMemory; } /** * @return the osName */ public String getOsName() { return osName; } /** * @param osName * the osName to set */ public void setOsName(String osName) { this.osName = osName; } /** * @return the totalMemorySize */ public long getTotalMemorySize() { return totalMemorySize; } /** * @param totalMemorySize * the totalMemorySize to set */ public void setTotalMemorySize(long totalMemorySize) { this.totalMemorySize = totalMemorySize; } /** * @return the freePhysicalMemorySize */ public long getFreePhysicalMemorySize() { return freePhysicalMemorySize; } /** * @param freePhysicalMemorySize * the freePhysicalMemorySize to set */ public void setFreePhysicalMemorySize(long freePhysicalMemorySize) { this.freePhysicalMemorySize = freePhysicalMemorySize; } /** * @return the usedMemory */ public long getUsedMemory() { return usedMemory; } /** * @param usedMemory * the usedMemory to set */ public void setUsedMemory(long usedMemory) { this.usedMemory = usedMemory; } /** * @return the totalThread */ public int getTotalThread() { return totalThread; } /** * @param totalThread * the totalThread to set */ public void setTotalThread(int totalThread) { this.totalThread = totalThread; } /** * @return the cpuRatio */ public double getCpuRatio() { return cpuRatio; } /** * @param cpuRatio * the cpuRatio to set */ public void setCpuRatio(double cpuRatio) { this.cpuRatio = cpuRatio; } /** * */ public MonitorInfoBean() { super(); } /** * @param totalMemory * @param freeMemory * @param maxMemory * @param osName * @param totalMemorySize * @param freePhysicalMemorySize * @param usedMemory * @param totalThread * @param cpuRatio */ public MonitorInfoBean(long totalMemory, long freeMemory, long maxMemory, String osName, long totalMemorySize, long freePhysicalMemorySize, long usedMemory, int totalThread, double cpuRatio) { super(); this.totalMemory = totalMemory; this.freeMemory = freeMemory; this.maxMemory = maxMemory; this.osName = osName; this.totalMemorySize = totalMemorySize; this.freePhysicalMemorySize = freePhysicalMemorySize; this.usedMemory = usedMemory; this.totalThread = totalThread; this.cpuRatio = cpuRatio; } }
其实封装实体对象,只是为了后面开发更加方便,习惯问题,这里接着来实现类:
/** * @Description: * * @Title: MonitorServiceImpl.java * @Package com.joyce.service.impl * @Copyright: Copyright (c) 2014 * * @author Comsys-LZP * @date 2014-4-24 上午11:14:53 * @version V2.0 */ package com.joyce.service.impl; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.LineNumberReader; import java.util.StringTokenizer; import sun.management.ManagementFactory; import com.joyce.bean.MonitorInfoBean; import com.joyce.service.IMonitorService; import com.joyce.util.Bytes; import com.sun.management.OperatingSystemMXBean; /** * @Description: * * @ClassName: MonitorServiceImpl * @Copyright: Copyright (c) 2014 * * @author Comsys-LZP * @date 2014-4-24 上午11:14:53 * @version V2.0 */ public class MonitorServiceImpl implements IMonitorService { private static final int CPUTIME = 30; private static final int PERCENT = 100; private static final int FAULTLENGTH = 10; private static String linuxVersion = null; @Override public MonitorInfoBean getMonitorInfoBean() throws Exception { int kb = 1024; // 可使用内存 long totalMemory = Runtime.getRuntime().totalMemory() / kb; // 剩余内存 long freeMemory = Runtime.getRuntime().freeMemory() / kb; // 最大可使用内存 long maxMemory = Runtime.getRuntime().maxMemory() / kb; OperatingSystemMXBean osmxb = (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean(); // 操作系统 String osName = System.getProperty("os.name"); // 总的物理内存 long totalMemorySize = osmxb.getTotalPhysicalMemorySize() / kb; // 剩余的物理内存 long freePhysicalMemorySize = osmxb.getFreePhysicalMemorySize() / kb; // 已使用的物理内存 long usedMemory = (osmxb.getTotalPhysicalMemorySize() - osmxb .getFreePhysicalMemorySize()) / kb; // 获得线程总数 ThreadGroup parentThread; for (parentThread = Thread.currentThread().getThreadGroup(); parentThread .getParent() != null; parentThread = parentThread.getParent()) ; int totalThread = parentThread.activeCount(); double cpuRatio = 0; if (osName.toLowerCase().startsWith("windows")) { cpuRatio = this.getCpuRatioForWindows(); } else { cpuRatio = this.getCpuRateForLinux(); } // 构造返回对象 MonitorInfoBean infoBean = new MonitorInfoBean(); infoBean.setFreeMemory(freeMemory); infoBean.setFreePhysicalMemorySize(freePhysicalMemorySize); infoBean.setMaxMemory(maxMemory); infoBean.setOsName(osName); infoBean.setTotalMemory(totalMemory); infoBean.setTotalMemorySize(totalMemorySize); infoBean.setTotalThread(totalThread); infoBean.setUsedMemory(usedMemory); infoBean.setCpuRatio(cpuRatio); return infoBean; } /** * @Description:获取Linux下CPU的使用率 * * @return * * @Title: MonitorServiceImpl.java * @Copyright: Copyright (c) 2014 * * @author Comsys-LZP * @date 2014-5-5 下午04:01:41 * @version V2.0 */ private double getCpuRateForLinux() { InputStream is = null; InputStreamReader isr = null; BufferedReader brStat = null; StringTokenizer tokenStat = null; try { System.out.println("Get usage rate of CUP , linux version: " + linuxVersion); Process process = Runtime.getRuntime().exec("top -b -n 1"); is = process.getInputStream(); isr = new InputStreamReader(is); brStat = new BufferedReader(isr); if (linuxVersion.equals("2.4")) { brStat.readLine(); brStat.readLine(); brStat.readLine(); brStat.readLine(); tokenStat = new StringTokenizer(brStat.readLine()); tokenStat.nextToken(); tokenStat.nextToken(); String user = tokenStat.nextToken(); tokenStat.nextToken(); String system = tokenStat.nextToken(); tokenStat.nextToken(); String nice = tokenStat.nextToken(); System.out.println(user + " , " + system + " , " + nice); user = user.substring(0, user.indexOf("%")); system = system.substring(0, system.indexOf("%")); nice = nice.substring(0, nice.indexOf("%")); float userUsage = new Float(user).floatValue(); float systemUsage = new Float(system).floatValue(); float niceUsage = new Float(nice).floatValue(); return (userUsage + systemUsage + niceUsage) / 100; } else { brStat.readLine(); brStat.readLine(); tokenStat = new StringTokenizer(brStat.readLine()); tokenStat.nextToken(); tokenStat.nextToken(); tokenStat.nextToken(); tokenStat.nextToken(); tokenStat.nextToken(); tokenStat.nextToken(); tokenStat.nextToken(); String cpuUsage = tokenStat.nextToken(); System.out.println("CPU idle : " + cpuUsage); Float usage = new Float(cpuUsage.substring(0, cpuUsage .indexOf("%"))); return (1 - usage.floatValue() / 100); } } catch (IOException ioe) { System.out.println(ioe.getMessage()); freeResource(is, isr, brStat); return 1; } finally { freeResource(is, isr, brStat); } } private static void freeResource(InputStream is, InputStreamReader isr, BufferedReader br) { try { if (is != null) is.close(); if (isr != null) isr.close(); if (br != null) br.close(); } catch (IOException ioe) { System.out.println(ioe.getMessage()); } } /** * @Description: 获取Windows下CPU的使用率 * * @return * * @Title: MonitorServiceImpl.java * @Copyright: Copyright (c) 2014 * * @author Comsys-LZP * @date 2014-5-5 下午04:02:12 * @version V2.0 */ private double getCpuRatioForWindows() { try { String procCmd = System.getenv("windir") + "\\system32\\wbem\\wmic.exe process get Caption,CommandLine," + "KernelModeTime,ReadOperationCount,ThreadCount,UserModeTime,WriteOperationCount"; // 取进程信息 long[] c0 = readCpu(Runtime.getRuntime().exec(procCmd)); Thread.sleep(CPUTIME); long[] c1 = readCpu(Runtime.getRuntime().exec(procCmd)); if (c0 != null && c1 != null) { long idletime = c1[0] - c0[0]; long busytime = c1[1] - c0[1]; return Double.valueOf( PERCENT * (busytime) / (busytime + idletime)) .doubleValue(); } else { return 0.0; } } catch (Exception ex) { ex.printStackTrace(); return 0.0; } } /** * @Description: 读取CPU信息 * * @param proc * @return * * @Title: MonitorServiceImpl.java * @Copyright: Copyright (c) 2014 * * @author Comsys-LZP * @date 2014-5-5 下午04:02:37 * @version V2.0 */ private long[] readCpu(final Process proc) { long[] retn = new long[2]; try { proc.getOutputStream().close(); InputStreamReader ir = new InputStreamReader(proc.getInputStream()); LineNumberReader input = new LineNumberReader(ir); String line = input.readLine(); if (line == null || line.length() < FAULTLENGTH) { return null; } int capidx = line.indexOf("Caption"); int cmdidx = line.indexOf("CommandLine"); int rocidx = line.indexOf("ReadOperationCount"); int umtidx = line.indexOf("UserModeTime"); int kmtidx = line.indexOf("KernelModeTime"); int wocidx = line.indexOf("WriteOperationCount"); long idletime = 0; long kneltime = 0; long usertime = 0; while ((line = input.readLine()) != null) { if (line.length() < wocidx) { continue; } // 字段出现顺序:Caption,CommandLine,KernelModeTime,ReadOperationCount, // ThreadCount,UserModeTime,WriteOperation String caption = Bytes.substring(line, capidx, cmdidx - 1) .trim(); String cmd = Bytes.substring(line, cmdidx, kmtidx - 1).trim(); if (cmd.indexOf("wmic.exe") >= 0) { continue; } // log.info("line="+line); if (caption.equals("System Idle Process") || caption.equals("System")) { idletime += Long.valueOf( Bytes.substring(line, kmtidx, rocidx - 1).trim()) .longValue(); idletime += Long.valueOf( Bytes.substring(line, umtidx, wocidx - 1).trim()) .longValue(); continue; } kneltime += Long.valueOf( Bytes.substring(line, kmtidx, rocidx - 1).trim()) .longValue(); usertime += Long.valueOf( Bytes.substring(line, umtidx, wocidx - 1).trim()) .longValue(); } retn[0] = idletime; retn[1] = kneltime + usertime; return retn; } catch (Exception ex) { ex.printStackTrace(); } finally { try { proc.getInputStream().close(); } catch (Exception e) { e.printStackTrace(); } } return null; } /** * @Description: 测试 * * @param args * @throws Exception * * @Title: MonitorServiceImpl.java * @Copyright: Copyright (c) 2014 * * @author Comsys-LZP * @date 2014-5-5 下午04:02:50 * @version V2.0 */ public static void main(String[] args) throws Exception { IMonitorService service = new MonitorServiceImpl(); MonitorInfoBean monitorInfo = service.getMonitorInfoBean(); System.out.println("cpu占有率=" + monitorInfo.getCpuRatio()); System.out.println("可使用内存=" + monitorInfo.getTotalMemory()); System.out.println("剩余内存=" + monitorInfo.getFreeMemory()); System.out.println("最大可使用内存=" + monitorInfo.getMaxMemory()); System.out.println("操作系统=" + monitorInfo.getOsName()); System.out.println("总的物理内存=" + monitorInfo.getTotalMemorySize() + "kb"); System.out.println("剩余的物理内存=" + monitorInfo.getFreeMemory() + "kb"); System.out.println("已使用的物理内存=" + monitorInfo.getUsedMemory() + "kb"); System.out.println("线程总数=" + monitorInfo.getTotalThread() + "kb"); } }
大家应该看出来了,怎么还有一个接口类没有呢,真的不想贴的,但是为了那些刚上手的或者很B的人还是贴上吧
/** * @Description: * * @Title: IMonitorService.java * @Package com.joyce.service * @Copyright: Copyright (c) 2014 * * @author Comsys-LZP * @date 2014-4-24 上午11:11:17 * @version V2.0 */ package com.joyce.service; import com.joyce.bean.MonitorInfoBean; /** * @Description: * * @ClassName: IMonitorService * @Copyright: Copyright (c) 2014 * * @author Comsys-LZP * @date 2014-4-24 上午11:11:17 * @version V2.0 */ public interface IMonitorService { public MonitorInfoBean getMonitorInfoBean() throws Exception; }
是不是很简单呀,好啦!至于怎么在界面上去展示,我就不在这里说了,有完整的案例,包括了以上看到的部分内容,还有ExtJs4的图表,这里就把测试运行结果就大伙看看啦
cpu占有率=16.0 可使用内存=5056 剩余内存=4794 最大可使用内存=65088 操作系统=Windows Vista 总的物理内存=4148916kb 剩余的物理内存=4794kb 已使用的物理内存=3478464kb 线程总数=5kb
其实Java也可以的吧,别怕,亲们,放手去搞!完整demo已上传,如需请下载:http://download.csdn.net/download/luo201227/7297885