Java调用Windows cmd命令 阻塞问题详解

开发中遇到最大的难题就是调用cvs命令更新和取log到文件
Java调用cmd命令有两种方法:
1. 	java.lang.ProcessBuilder builder = new ProcessBuilder(cmdArray);
	builder.directory(new File(workdirectory));
	Process process = builder.start();
	
2. 	java.lang.Runtime.getRuntime().exec("cmd");
	OutputStream os = logProcess.getOutputStream();
	os.write(command.getBytes());
	os.flush();


问题1: cvs log输出重定向。

第一种方法看起来很美,无奈不支持io重定向,于是无法用来调用cvs log命令并输出到文件
第二种方法是调用windows的cmd程序,用起来很麻烦,包括目录定位都需要人肉使用”cd“指令,但是优点是完全支持cmd下的各种指令,
包括io重定向,所以可以解决cvs log输出到文件的问题。


解决办法:使用方法2.


问题2:cvs log和cvs update输出流内容(标准输出、标准错误输出)太多,不及时读出会导致缓冲区满,进程阻塞。
第一种方法需要将标准输出和标准错误输出同时读出,因为任何一个缓冲区满都回导致阻塞,故需要用多线程同时去兼顾两个输出流。
第二种方法因为可以使用输出重定向,不需要再care标准输出,故只需要在调用命令后读取标准错误输出即可。
需要注意的是第二种方法在读取标准错误输出前需要先将指令输入流close掉,这个我仍不清楚什么原因,可能类似于”ctrl+z“的作用。


解决办法:cvs update不需要输出重定向,故使用方法1调用,cvs log用方法2。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值