OS Monitor

OS Monitor项目

项目使用技术栈与平台

  • 所用技术:javaSE/javafx
  • 平台与环境:windows 10/jdk 1.8/idea

项目功能

  • 显示 CPU 占有率
  • 文件目录扫描

项目展示

  • CPU占有率
    在这里插入图片描述
  • 文件目录扫描
    在这里插入图片描述

项目思路

  • 项目总体模块框图
  • 创建主程序
  • fxml 描述 UI
  • CPU 占有率 Tab 页设计
  • 磁盘扫描 Tab 页设计
  • Controller 模块
  • 系统资源获取模块
  • 文件目录扫描模块

项目细节

总框图
OS Monitor 项目结构分为两部分:UI 部分和逻辑部分
UI 部分包括:主程序、磁盘空间扫描 Tab 页、CPU占有率 Tab 页、Controller。UI部分是通过 javafx来实现
逻辑部分主要包括:系统资源获取、文件目录扫描。系统资源是通过OperatingSystemMXBean 来获取。
在这里插入图片描述
主程序
将项目自动生成的主程序替换

//所有 javafx 主程序必须派生自 Application 类
//子类必须 override 父类的 start 方法
public class OSMonitorApplication extends Application {
	@Override
	public void start(Stage primaryStage) throws Exceotion {
		//加载 .fxml 文件
		FXMLLoader loader = new FXMLLoader(getClass().getClassLoader().getResource("os_monitor_tab1.fxml"));
		Parent root = loader.load();
		//2.创建一个场景对象
		Scene scene = new Scene(root,800,600);
		//3.给舞台对象设置标题
		primaryStage.setTitle("OS Monitor");
		//4.给舞台对象Stage 设置场景对象 scene
		primaryStage.setScene(scene);
		//5.展示舞台
		primaryStage.show();
	}
}

fxml 描述 UI
OS Monitor UI 主框架包含两个tab页,用到的控件是 和 。代表tab页所在的容器面板,代表一个个的tab页

<?xml version="1.0" encoding="UTF-8"?> 
// 导入类路径 
<?import javafx.geometry.Insets?>
<VBox maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" 
minWidth="-Infinity" xmlns="http://javafx.com/javafx/8.0.171" 
xmlns:fx="http://javafx.com/fxml/1" 
fx:controller="com.haska.ui.OSMonitorController">   
	<children>      
		<TabPane tabClosingPolicy="UNAVAILABLE">         
			<tabs>            
				<Tab onSelectionChanged="#handleCPUSelectionChanged" text="CPU 占有 率">               
					<content>                 
					...               
					</content>            
				</Tab>            
				<Tab text="磁盘空间统计">               
					<content>                 
					...               
					</content>            
				</Tab>         
			</tabs>      
		</TabPane>   
	</children> 
</VBox> 

CPU 占有率 Tab 页设计
CPU 占有率 = CPU 执行程序时间/统计周期时间。比如,每100ms统计一次占有率,如果 CPU 执行程序用了90ms,那么CPU占有率就是 90/100 = 90%。CPU执行程序时间包括:用户主程序执行时间和内核空间执行时间、
CPU占有率Tab页主要是通过 空间绘制曲线图,x轴和y轴都用控件。通过控件的onSelectionChange属性设置监听时间的方法:
handleCPUSelectionChange。

<LineChart fx:id="cpuChart" animated="false" HBox.hgrow="ALWAYS">   
	<xAxis>       
		<NumberAxis animated="false" label="Seconds" side="BOTTOM" />   
	</xAxis>   
	<yAxis>       
		<NumberAxis animated="false" label="Percent" side="LEFT" />   
	</yAxis> 
</LineChart>

磁盘扫描 Tab 页设计
磁盘扫描Tab页主要是用到了控件,绘制一个树形表格。另外设计了一个 控件来选择文件目录,通过 控件的 onAction属性设置监听事件的方法:handleSelectFile。

<Label text="选择文件目录:"></Label> 
<Button mnemonicParsing="false" onAction="#handleSelectFile" prefWidth="80.0" 
text="选择" GridPane.columnIndex="1">   
	<GridPane.margin>      
		<Insets bottom="5.0" top="5.0" />   
	</GridPane.margin> 
</Button>

<TreeTableView fx:id="fileStat" HBox.hgrow="ALWAYS">   
	<columns>      
		<TreeTableColumn prefWidth="75.0" text="目录名">          
			<cellValueFactory>             
				<TreeItemPropertyValueFactory property="fileName" />          
			</cellValueFactory>      
		</TreeTableColumn>      
		<TreeTableColumn prefWidth="75.0" text="总长度">           
			<cellValueFactory>             
				<TreeItemPropertyValueFactory property="totalLength" />           
			</cellValueFactory>      
		</TreeTableColumn>   
	</columns> 
</TreeTableView>

Controller模块
Controller 主要是处理 UI 事件,需要将此类添加到 .fxml 文件中,我们用到的顶级容器是 ,通过 fx:controller 属性设置 Controller 类的包路径,方法如下:

<VBox maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" 
minWidth="-Infinity" xmlns="http://javafx.com/javafx/8.0.171" 
xmlns:fx="http://javafx.com/fxml/1" 
fx:controller="com.haska.ui.OSMonitorController"> 
</VBox>

在Controller中,我们需要处理两个事件:CPU占有率和目录结构统计

// 磁盘目录扫描事件处理方法 
public void handleSelectFile(ActionEvent actionEvent) { 
    // 1. 打开文件选择对话框   
    // 2. 开启磁盘目录扫描线程    
    // 3. 渲染TreeTableView 
} 
	// CPU 占有率事件处理方法 
public void handleCPUSelectionChanged(Event event) {    
	// 1. 创建一个定时器,每隔一秒获取一次 CPU 资源绘制曲线图    
	// 2. 绘制 LineChart 
}

系统资源获取模块
系统资源获取采用的是 OperatingSystemMXBean,这是一个 JMX 接口,用于获取运行JVM的系统的资源信息,比如,CPU占有率、OS 版本、内存大小等。我用的是com.sun.managerment.OperatingSystemMXBean 类,接口比较简单。
绘制CPU占有率曲线的核心思想:
1.每隔一秒对CPU占有率进行一次采样,作为数轴的 y坐标
2.一共保存60s,即一分钟的样本点,时间作为x坐标
3.用一个数组保存坐标(x,y),每一次采样需要把之前采样的坐标点的 x 坐标 减1,这样绘制的时候就会产生移动的效果
核心代码:

private static final int DATA_LENGH = 60; 
private static XYPair[] cpuDatas = new XYPair[DATA_LENGH]; 
private static int firstIndex = DATA_LENGH;
private static void moveCPUData(double cpuPercetage){
        int movIdx = -1;        
        if (firstIndex == 0){            
        	movIdx = firstIndex + 1;        
        }else {            
        	movIdx = firstIndex;            
        	firstIndex--;        
        }
        for (; movIdx < cpuDatas.length; ++movIdx){
            cpuDatas[movIdx-1].setX(cpuDatas[movIdx].getX()-1);            
            cpuDatas[movIdx-1].setY(cpuDatas[movIdx].getY());        
        }
        movIdx--;
        cpuDatas[movIdx] = new XYPair(movIdx, cpuPercetage); 
}

文件目录扫描模块
核心思想:用递归的方式遍历文件目录结构,统计某个目录下所有子目录占用总的磁盘空间大小,然后再做一个汇总
相关代码:

File[] files = node.getFile().listFiles(); 
if (files == null) {
    return; 
}
for (File file : files) {   
	FileTreeNode child = new FileTreeNode();   
	child.setFile(file);   
	child.setFileName(file.getName());
   
   if (file.isDirectory()) {        
   	   scannerDirectory(child);   
   } else {        
   		child.setTotalLength(file.length());   
   }   
   node.setTotalLength(node.getTotalLength() + child.getTotalLength());   
   node.addChildNode(child); 
}

项目总结

  • 项目优点:引入了javafx技术,通过图形化界面展示了CPU占有率和磁盘空间统计,显得更直观。
  • 项目缺点:项目的所实现的功能相对简单,UI不够美观

以上就是OS Monitor项目相关介绍

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值