JAVA调用系统命令——Process.waitFor超时问题

本文探讨了在Java中调用系统命令时遇到的Runtime.exec()和ProcessBuilder.start()方法的空格问题及阻塞问题。特别强调了Process.waitFor()可能导致的阻塞,原因是子进程的标准输出或错误流缓冲区满导致。解决方案包括分开线程读取输出流和错误流,或者将stderr重定向到stdout。文章提供了相关代码示例和资源链接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在编写Java程序时,有时候我们需要调用其他的诸如exe,shell这样的程序或脚本。

Java虚拟机执行Runtime.getRuntime().exec()方法的过程是:首先克隆一个和当前虚拟机拥有一样环境变量的进程,再用这个进程去执行外部命令,最后再退出这个进程。如果频繁执行这个操作,系统消耗会很大,不仅是CPU,内存负担也很大。

在Java中提供了两种方法来启动其他程序:

  1. 使用Runtime的exec()方法
  2. 使用ProcessBuilder的start()方法 。

Runtime和ProcessBulider提供了不同的方式来启动程序,设置启动参数、环境变量和工作目录。但是这两种方法都会返回一个用于管理操作系统进程的Process对象,再调用Process.waitFor()来等待命令执行结束,获取执行结果。

然而这样简单的调用也是有坑的,有几个地方需要小心留意

###1、命令拼接空格问题(推荐使用ProcessBuilder) ####1.1 通过Runtime.getRuntime().exec()方式

String htmlName = CONTRACT_PATH + File.separator + cid + HTML
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值