java执行命令行,以及解决卡死问题
java可以执行本地命令行,但是有一个坑,命令执行后,已经执行完毕,但是卡死不返回,这是因为:
命令会返回两个输出流,正确的返回流,和错误的返回流
一般程序的做法是先循环读正确的返回流,再读错误的返回流,当正确的返回流读不完的时候,有可能错误的返回流已经占满了缓存,所以导致了卡死,
解决办法是:
1.单独起一个线程读取错误流,这样的情况下,错误流比较不好保存
2.使用ProcessBuild类,这个类可以把错误流重定向到正确流,这样只读一个流就可以了,不论正确或错误,都能读到返回,下面是个例子
ProcessBuilder pb;
Process process = null;
BufferedReader br = null;
StringBuilder resMsg = null;
OutputStream os = null;
String cmd1 = "sh";
try {
pb = new ProcessBuilder(cmd1);
pb.redirectErrorStream(true);
process = pb.start();
os = process.getOutputStream();
os.write(command.getBytes());
os.flush();
os.close(); resMsg = new StringBuilder();
// get command result
if (isNeedResultMsg) {
br = new BufferedReader(new InputStreamReader(process.getInputStream()));
String s;
while ((s = br.readLine()) != null) {
resMsg.append(s + "\n");
}
resMsg.deleteCharAt(resMsg.length()-1);
result = process.waitFor();
}
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (os != null) {
os.close();
}
if (br != null) {
br.close();
}
} catch (IOException e) {
e.printStackTrace();
} if (process != null) {
process.destroy();
}
}
return resMsg.toString();
via:https://my.oschina.net/u/222749/blog/2965712
java执行命令行,以及解决卡死问题的更多相关文章
- 一些坑 Java 执行命令行命令 Spring Boot 打包为jar ResourceUtils.getFile 等出现的问题
Java 执行命令行命令 这个没技术含量的东西耗费了我半个多小时 String command = ....; Process process = Runtime.getRuntime().exec( ...
- Java执行命令行脚本
百度到的 Process p=Runtime.getRuntime().exec("C:\\test.cmd"); ProcessBuilder processBuilder=ne ...
- java执行命令行命令
package javai; import java.io.BufferedReader; import java.io.InputStreamReader; public class IOTest ...
- java执行命令行
List<String> command = new ArrayList<String>(); command.add("ping"); ProcessBu ...
- Python执行命令行
背景 我们知道,虽然会破坏平台独立性,但是有的时候需要在代码里面调用命令行来获取一些信息,那么了解在 Python 中如何执行命令行至关重要 使用介绍 Python 中使用命令行可以通过 subpro ...
- 【转载】在LoadRunner向远程Linux/Unix执行命令行并收集性能数据
前面介绍过在LoadRunner的Java协议实现“使用SSH连接Linux”,当然连接之后的故事由你主导. 今天要讲的,是一个非Java版本.是对“在LoadRunner中执行命令行程序之:pope ...
- 通过JAVA调用命令行程序
这是我在把数据导入到数据库时遇到问题,总结下来的.包含两个方法,一个方法是读取文件路径下的文件列表,主方法是执行cmd命令,在导入时想得到导入一个文件的时间,涉及到线程阻塞问题,这个问题理解不是很深, ...
- 在LoadRunner向远程Linux/Unix执行命令行并收集性能数据
前面介绍过在LoadRunner的Java协议实现“使用SSH连接Linux”,当然连接之后的故事由你主导. 今天要讲的,是一个非Java版本.是对“在LoadRunner中执行命令行程序之:pope ...
- Git命令行下解决冲突
使用Git时,在pull.merge.rebase的过程中,经常会遇到conflict的情况. 遇到conflict时,以上处理过程会终端,并且命令行中显示(xxx|MERGING)的状态(Windo ...
随机推荐
- java集合之 ConcurrentHashMap的产生
ConcurrentHashMap: 在java集合中 最常用的是ArrayList 效率最高的还是HashMap 但是线程不安全 HashTable是线程安全的(里面的方法是同步方法) 但相比 ...
- C# 方法,属性,字段
以前是学C++的,初次学微软的C#头都大了.什么字段,常量,属性,方法......微软把别人的东西拿来糅合在C#里,弄成了一个“大杂烩”.其实,说到底,“字段”不就是“变量”吗,所谓的“方法”不就是“ ...
- Jquery复习(四)之text()、html()、val()
三个简单实用的用于 DOM 操作的 jQuery 方法: text() - 设置或返回所选元素的文本内容 html() - 设置或返回所选元素的内容(包括 HTML 标记) val() - 设置或返回 ...
- 使用html2canvas实现屏幕截图
相关文件(vue3.0) <script src="https://cdn.jsdelivr.net/bluebird/latest/bluebird.js">< ...
- Scala Nothing 从官方DOC翻译
Nothing is - together with scala.Null - at the bottom of Scala's type hierarchy. Scala中的Nothing和Null ...
- Windows 下apache https配置(phpstudy)
1.首先获取证书,https://www.pianyissl.com/ 免费三个月的 或者 自己生成私钥.证书,然后应用到apache中. http://blog.sina.com.cn/s/blo ...
- Delphi 帮助的使用
- SQL Server 2005还原数据库时出现“不能选择文件或文件组XXX_log用于此操作的解决办法
SQL2005 还原数据库失败,提示如下: SQL Server 2005还原数据库时出现“不能选择文件或文件组XXX_log用于此操作的解决办法 出现错误时操作步骤为:右击数据库--->任务- ...
- [转载]一个支持Verilog的Vim插件——AutoDef
原文地址:一个支持Verilog的Vim插件--AutoDef作者:hover 支持一下四种类型的变量声明: 1)时序always块中的寄存器变量reg 2)组合always块中的组合reg变量reg ...
- 将临时全局表中的符合字段导入test数据库中
--表1 开户级别表 insert into test.dbo.crm_m_cust_summary(CUST_CERT_N O,ASSETAMT_GRADE_CD)select cust_no,cu ...