java中运行指令浅析
后续业务可能需要在程序中运行指令, 所以这里简单探究了一下, 分别从win和linux两个平台进行研究, 又以为java是跨平台语言, 可能二者之间的区别应该只是返回内容与输入指令的不同. (还不是在win上开发)
1. 如何使用
Runtime.getRuntime().exec("notepad");RuntimeUtil.exec("notepad");// hutool了解了使用方法, 接下来探究几个问题.
2. 如何获取返回值
-
public static String execCMD(String command) {
StringBuilder sb = new StringBuilder();
try {
Process process = Runtime.getRuntime().exec(command);
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line;
while ((line = bufferedReader.readLine()) != null) {
sb.append(line).append("\n");
}
} catch (Exception e) {
return e.toString();
}
return sb.toString();
}
hutool中用法1:
String str = RuntimeUtil.execForStr("ipconfig");hutool中用法2:
List<String> ss = RuntimeUtil.execForLines("ipconfig");需要注意一点:
参数
command: a string array containing the program and its arguments.以上所有的
command并不是cmd命令行中的命令, 而是在运行窗口(win+r)可以运行的, 比如dir这个典型的cmd命令, 在win+r的运行窗口就不能运行. 可以使用cmd /c dir来运行./c 是运行完不显示窗口, /k是运行完显示, 其他参数可在cmd指令中打出
cmd /?查看
3. 模拟在取结果时候堵塞进程
代码
System.err.println(DateUtil.format(new Date(), DatePattern.NORM_DATETIME_MS_PATTERN));
System.err.println(RuntimeUtil.execForStr("ping 192.168.0.222 /n 2"));
System.err.println(DateUtil.format(new Date(), DatePattern.NORM_DATETIME_MS_PATTERN));
输出:
2022-07-15 16:34:50.523 正在 Ping 192.168.0.222 具有 32 字节的数据:
来自 192.168.0.222 的回复: 字节=32 时间=49ms TTL=128
来自 192.168.0.222 的回复: 字节=32 时间=16ms TTL=128 192.168.0.222 的 Ping 统计信息:
数据包: 已发送 = 2,已接收 = 2,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
最短 = 16ms,最长 = 49ms,平均 = 32ms 2022-07-15 16:34:51.575
结论
确实可以看到两个时间相差1s左右. 可以将
ping ** /n 2中的2调大一些查看区别.接下来我们把ping命令换成
notepad或cmd /c notepad, 可以看到直接堵死了.在linux系统的终端运行firefox, 在终端会显示对应日志.
对应到我们例子中, 执行exec方法时候会有返回一个进程p,
我们就是从进程p的输入流中拿到的程序/指令返回的内容(写在命令行中的内容)
正常情况下程序执行完就自动结束了, 但是记事本/firefox不会自动停止,
所以线程会一直占用着, 与是否写日志无关.
如果这种情况下获取返回内容, 可以将返回内容写入全局数组
另外使用线程异步进行读取.
4. 刨析进程的从属关系
代码(放在接口中测试)
ThreadUtil.execAsync(() ->
RuntimeUtil.execForStr("notepad"));
ThreadUtil.execAsync(() ->
RuntimeUtil.execForStr("ping 192.168.0.222 /t"));
ThreadUtil.execAsync(() ->
RuntimeUtil.execForStr("notepad"));
运行, 使用
Process Explorer软件查看
运行一次.

运行3次.
可以看到执行的这些都是
java.exe的子线程, 那么当我们停止java.exe程序时候, 其下的子程序也会一起被杀掉吗?其实不会, 这些线程会被移动到根目录下

这很疑惑, 接下来来一个对比类型, 打开命令行输入`ping localhost \t, 查看进程

可以看到cmd是在
explorer.exe下的进程, 就是我们的资源管理器(包括桌面这些, 并不只是我的电脑),而且不同之处是
ping.exe, 代码生成的会自带一个conhost, 手动执行的则平级生成的.然后又测试了使用
Runtime.getRuntime().exec("ping 192.168.0.111 /t");生成, 发现当关闭java.exe时还是会移动到最后.
手动杀掉java也不会影响(树影响), 但是手动命令行中启动的ping在只杀掉命令行时候会一同将子目录杀掉
尚未在实际中应用, 暂时到此为止.
java中运行指令浅析的更多相关文章
- 怎样在Java中运行Hive命令或HiveQL
这里所说的在Java中运行Hive命令或HiveQL并非指Hive Client通过JDBC的方式连接HiveServer(or HiveServer2)运行查询,而是简单的在部署了HiveServe ...
- Java中运行javascript代码
Java中运行javascript代码 1.Java 代码 2.JS代码 2.1demoWithParams.js 2.2demoWithListParams.js 原文作者:russle 原文地址: ...
- Java中运行时异常和非运行时异常什么鬼?
Java中的异常分类 RuntimeException(也称unchecked exceptions,运行时异常) 就是我们在开发中测试功能时程序终止,控制台出现的异常.(一般来说,出现运行时异常基本 ...
- Java中运行动态脚本
这里主要总结Java中集成Groovy的应用. Groovy可以与Java完美集成来扩展我们的应用,比如替代Java+jexl实现算式表达式计算或其它功能.在Ofbiz中也集成了Groovy来执行一些 ...
- IDEA清空控制台以及Java中运行cmd命令实现清屏操作
IDEA中清空控制台方法 在网上有看到各种的实现方法,比如: Runtime.getRuntime().exec("cls"); 或者: public static void cl ...
- Java中的HashMap 浅析
在Java的集合框架中,HashSet,HashMap是用的比较多的一种,顺序结构的ArrayList.LinkedList这种也比较多,而像那几个线程同步的容器就用的比较少,像Vector和Hash ...
- java中io流浅析
1.java.io包下File类:java程序中的此类的一个对象,就对应着硬盘中的一个文件或网络中的一个资源.File file1 = new File("d:\\io\\helloworl ...
- Java中的字符串常量池和JVM运行时数据区的相关概念
什么是字符串常量池 JVM为了减少字符串对象的重复创建,其维护了一个特殊的内存,这段内存被成为字符串常量池或者字符串字面量池 工作原理 当代码中出现字面量形式创建字符串对象时,JVM首先会对这个字面量 ...
- java中堆栈(stack)和堆(heap)(还在问静态变量放哪里,局部变量放哪里,静态区在哪里.....进来)
(1)内存分配的策略 按照编译原理的观点,程序运行时的内存分配有三种策略,分别是静态的,栈式的,和堆式的. 静态存储分配是指在编译时就能确定每个数据目标在运行时刻的存储空间需求,因而在编 译时就可以给 ...
- 3.2 java中堆栈(stack)和堆(heap)(还在问静态变量放哪里,局部变量放哪里,静态区在哪里.....进来)
(1)内存分配的策略 按照编译原理的观点,程序运行时的内存分配有三种策略,分别是静态的,栈式的,和堆式的. 静态存储分配是指在编译时就能确定每个数据目标在运行时刻的存储空间需求,因而在编 译时就可以给 ...
随机推荐
- Java API 之 Object
Object 顶级父类.任何一个类都将 Object 作为父类,也就意味着任何一个对象都可以赋值给 Object 对象.Object 类也是 Java 中唯一的一个没有父类的类. (方法默认是 pub ...
- 直播预览层添加滤镜效果(CIFilter使用场景)
直播预览层添加滤镜效果 原理,在显示之前,提前对图片进行滤镜处理,把处理后的图片展示出来就好了. CIFiter(滤镜类):给图片添加特殊效果(模糊,高亮等等). CIFiter滤镜分类(一个滤镜可能 ...
- 常用的MySQL备份/还原 的方法
mysql备份数据库 mysql备份单个数据库 #mysql备份某个库格式: mysqldump -h主机名 -P端口 -u用户名 -p"密码" --database 数据库名 & ...
- Linux系统设置用户密码规则(复杂密码策略)方法
Linux系统下的用户密码的有效期 可以修改密码可以通过login.defs文件控制.设置密码过期期限(默认情况下,用户的密码永不过期.) 编辑 /etc/login.defs 文件,可以设置当前密码 ...
- vim系列-文本操作篇
基数行与偶数行分组 使用Vim的替换命令,可以轻松地将基数行和偶数行分组: %s/\(^.*$\)\n\(^.*$\)/\1 \2/g 然后,删除所有的基数行: %s/^.*$\n\(^.*$\)/\ ...
- ORACLE多表级联更新( MERGE、UPDATE FROM JOIN替代语句)
方法一:MERGE语句的语法 MERGE INTO 表名 USING 表名/视图/子查询 ON 连接条件 --多个条件注意()括起来 WHEN MATCHED THEN -- 当匹配得上连接条件时 更 ...
- P10353 [PA2024] Grupa permutacji 题解
神秘!在这些排列生成的置换群 \(G\) 里,若 \(\exists \pi \in G\) 使得 \(\pi_i=k,\pi_j=l\),则所有这些 \((k,l)\) 被同样数量的 \(\pi\i ...
- AI 如何重塑劳动力市场:基于 Claude 数据的深度分析
前言 本文翻译自 Anthropic 今天发布的 The Anthropic Economic Index ,经济指数报告,这份报告基于 Claude 的数据对目前的 AI 使用情况做了汇总. 引言 ...
- 『Python底层原理』--CPython的变量实现机制
在Python中,变量的使用看起来非常简单,例如 a = 10,s = "hello"等等. 然而,这种简单的赋值操作背后,CPython其实做了很多复杂的工作. 本文将通过一些简 ...
- OpenLayers 4326地图 根据距离设置地图分辨率
问题:给一个距离,如何确定4326地图缩放等级或者分辨率使地图视口范围为这个距离 我本来打算计算从地图视口左上角到右下角的距离来计算地图缩放的,然后发现不好算,我也不会算,于是就计算水平方向距离的缩放 ...