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项目相关介绍