process java waitfor_Java process.waitFor() 卡死问题记录

在使用Java调用unar或unrar命令解压时,遇到process.waitFor()卡住的问题,原因可能是解压过程中大量输出信息填满了默认的缓冲区。为避免这种情况,需要显式指定标准错误流和标准输入流,通过proc.getErrorStream()和proc.getInputStream()将其导向程序,以确保及时处理输出,防止阻塞或死锁。及时读取子进程的输出流对于保持进程的正常运行至关重要。
摘要由CSDN通过智能技术生成

最近使用Java调用本地命令unar unrar时出现process.waitFor()卡住不运行问题,特此记录

Process proc = Runtime.getRuntime().exec(cmd);

如果代码中不指定InputStream、ErrorStream,默认是会写入本地操作系统的缓冲区,这个缓冲区空间有限因为压缩包中有大量的文件解压过程中输出的信息很多,缓冲区满了,或错误信息过多占满缓冲区,就会产生卡住的问题

解决办法

指定标准错误、和标准输入到我们的程序而不是缓冲区

proc.getErrorStream()

proc.getInputStream()

引用一段JDK Class Process文档的描述

Runtime.exec方法创建过程可能不是某些本地平台特殊工序的操作,如本地的窗口过程,守护进程,运行在微软Windows、DOS程序,或shell脚本。

默认情况下,创建的子进程没有自己的终端或控制台。所有标准I / O(即stdin,stdout和stderr)操作将被重定向到父进程,在那里他们可以通过流获得的使用方法getOutputStream(),getInputStream()访问,和getErrorStream()。父进程使用这些流给输入和输出的过程。因为一些本地平台仅提供了标准的输入和输出流有限的缓冲区大小,未能及时写或读输入流的子进程的输出流可能会造成子进程的阻塞,甚至死锁。

来源:oschina

链接:https://my.oschina.net/kdy1994/blog/4255294

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值