使用ProcessBuilder创建process时,BufferedReader.readLine()超时
2016-08-05 18:13
274 查看
在Java中,用ProcessBuilder创建一个Process,向cmd输入命令,拿到正常输出和error,方法如下:
String cmds = ...;
ProcessBuilder builder = new ProcessBuilder("cmd");
builder.redirectErrorStream(true); //将error和正常输出都转换到输出,用getInputStream都可以得到
Process process = builder.start();
BufferedWriter pStdin = new BufferedWriter(new OutputStreamWriter(p.getOutputStream()));
pStdin.write(cmd);
pStdin.newLine();
pStdin.flush();
process.getOutputStream().close(); // 关掉输入流
BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream()));
String readLine = br.readLine();
while (readLine != null) {
System.out.println(readLine); //既有正常输出和error message。
readLine = br.readLine();
}
如果去掉第二行标红的代码,执行时会报错,原因可能是process一直等待outputStream输入。
如果不加第一行标红代码,同事使用process.waitfor,也可能报错,原因可能是getErrorStream流和getInputStream流相互阻塞,所以最好将他们合并。
String cmds = ...;
ProcessBuilder builder = new ProcessBuilder("cmd");
builder.redirectErrorStream(true); //将error和正常输出都转换到输出,用getInputStream都可以得到
Process process = builder.start();
BufferedWriter pStdin = new BufferedWriter(new OutputStreamWriter(p.getOutputStream()));
pStdin.write(cmd);
pStdin.newLine();
pStdin.flush();
process.getOutputStream().close(); // 关掉输入流
BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream()));
String readLine = br.readLine();
while (readLine != null) {
System.out.println(readLine); //既有正常输出和error message。
readLine = br.readLine();
}
如果去掉第二行标红的代码,执行时会报错,原因可能是process一直等待outputStream输入。
如果不加第一行标红代码,同事使用process.waitfor,也可能报错,原因可能是getErrorStream流和getInputStream流相互阻塞,所以最好将他们合并。
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序