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。

你可能感兴趣的:(Java,Process,cmd,windows,java,cvs,多线程,io)