1. 基本介绍
作为一个 Java
工程师,经常会遇到这么个场景:IDEA
里的程序正在运行,此时直接关闭了 IDEA
而没有先关闭正在运行的服务。
在绝大多数情境下,此方式都无伤大雅,但总有一些抽风的场景运行的程序并没有被正常的关闭,也就导致了重启项目时将会提示 xxxx
端口已被占用。
在 Windows
下此方式解决也十分简单,在命令行输入下述两个命令即可根据端口关闭对应的进程。
# 端口占用进程
netstat -ano | findstr <port>
# 进程关闭
taskkill -PID <pid> -F
虽然说也不麻烦但却很繁杂,试想一下当遇到这种情况下,我需要先翻笔记找出这两个命令,在打开命令行窗口执行,一套连招下来相当影响编程情绪。
因此,我决定写一个程序能够便捷的实现这个操作,最好是带 GUI
页面。
2. 实现机制
说干就干,整个程序功能其实并不复杂,对于页面的展示要求也不高,我就确定下来了直接通过 Java Swing
实现 GUI
部分。而对于命令执行部分,在 Java
中提供了 Process
类可用于执行命令。
先让我们看下 Process
的作用方式,以最简单的 ping baidu.com
测试为例。
public void demo() {
ProcessBuilder processBuilder = new ProcessBuilder();
List<String> command = new ArrayList<>();
command.add("ping");
command.add("www.baidu.com");
processBuilder.command(command);
try {
Process process = processBuilder.start();
try (
InputStreamReader ir = new InputStreamReader(process.getInputStream(), "GBK");
BufferedReader br = new BufferedReader(ir)
) {
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
运行上述的代码,在控制台可以得到下图结果:
在上述程序中,ProcessBuilder
用于构建命令,processBuilder.start()
则相当于你敲下回车执行,而执行的结果的则以 IO
流的形式返回,这里通过 readLine()
将返回的结果逐行的形式进行读取。
了解的大概原理之后,剩下的事情就简单了,只需要将之前提到的两个命令以同样的方式通过 Process
执行就可以,再通过 Java Swing 进行一个页面展示就可以。
具体的实现并不复杂,这里就不详细展开介绍,完整的项目代码已经上传到 GitHub
,感兴趣的小伙伴可自行前往查看,仓库地址:windows-process。
3. 程序介绍
下面主要介绍程序的使用与效果,开始前可以去上述提到的仓库 relase
里将打包完成的 exe
程序下载,下载地址。
下载后启动 window process.exe
程序,在启动之后会先弹出下图的提示,这是因为使用了 exe4j
打包程序,选择确认即可。
选择确认之后即会展示下图页面,列表中展示的数据即 netstat -ano
命令返回的结果。
在选中列表任意一条进程记录后,会将该进程对应的端口号和 PID
填充至上面的输入框中。
同时,可在 Port
输入框中输入对应的端口号实现快速查询,若需要停止某个进程,则将点击对应端口进程记录其 PID
会自动填入输入框中,然后单击 Kill
按钮,成功停止进程后将会进行相应的提示。
最后的最后,再臭不要脸的给自己要个赞,觉得不错的可以去 GitHub
仓库上下载下来看看,如果能点个 star
更是万分感谢,这里再贴一下仓库地址:windows-process。