java 子进程输出流_具有输入/输出流的Java进程

首先,我建议更换这条线路。Process process = Runtime.getRuntime ().exec ("/bin/bash");

带着线条ProcessBuilder builder = new ProcessBuilder("/bin/bash");builder.redirectErrorStream(true);Process process = builder.start();

ProcessBuilder是Java 5中的新版本,使运行外部进程更容易。在我看来,它比Runtime.getRuntime().exec()它允许您将子进程的标准错误重定向到其标准输出中。这意味着你只有一个InputStream读。在此之前,您需要有两个单独的线程,一个从stdout从stderr,以避免在标准输出缓冲区为空(导致子进程挂起)时填充标准错误缓冲区,反之亦然。

接下来,循环(其中有两个)while ((line = reader.readLine ()) != null) {

System.out.println ("Stdout: " + line);}

只有在reader,它从进程的标准输出中读取,返回文件结束。只有当bash进程退出。如果目前没有进程的输出,它将不会返回文件末尾。相反,它将等待进程的下一行输出,直到有了下一行才返回。

由于在到达此循环之前,您要向进程发送两行输入,如果在这两行输入之后进程尚未退出,则这两个循环中的第一个循环将挂起。它将坐在那里等待另一行被阅读,但它将永远不会有另一行可读。

我编译了你的源代码(我现在Windows上,所以我替换了/bin/bash带着cmd.exe,但原则应该是相同的),我发现:输入两行后,出现前两个命令的输出,但是程序挂起,

如果我打字,比如说,

echo test,然后

exit,程序退出了第一个循环,因为

cmd.exe进程已经结束。然后,程序请求另一行输入(被忽略),直接跳过第二个循环,因为子进程已经退出,然后退出。

如果我输入

exit然后

echo test,我收到一个IOException抱怨管道被关闭。这是意料之中的-第一行输入导致进程退出,没有地方发送第二行。

我在我曾经做过的一个程序中,看到了一个类似于你想要的东西的把戏。这个程序保存了许多shell,在其中运行命令并读取这些命令的输出。使用的技巧是始终写出一个“魔术”行,标记shell命令的输出结束,并使用它来确定发送到shell的命令的输出何时完成。

我取下了您的代码,在分配给您的行之后,我替换了所有的代码。writer使用以下循环:while (scan.hasNext()) {

String input = scan.nextLine();

if (input.trim().equals("exit")) {

// Putting 'exit' amongst the echo --EOF--s below doesn't work.

writer.write("exit\n");

} else {

writer.write("((" + input + ") && echo --EOF--) || echo --EOF--\n");

}

writer.flush();

line = reader.readLine();

while (line != null && ! line.trim().equals("--EOF--")) {

System.out.println ("Stdout: " + line);

line = reader.readLine();

}

if (line == null) {

break;

}}

完成此操作后,我可以可靠地运行几个命令,并将每个命令的输出分别返回给我。

两人echo --EOF--发送到shell的行中的命令,以确保命令的输出以--EOF--即使在命令错误的结果中。

当然,这种方法也有其局限性。这些限制包括:如果输入一个等待用户输入的命令(例如,另一个shell),则程序似乎挂起,

它假设shell运行的每个进程都以换行符结束其输出,

如果shell运行的命令恰好写出一行,就会有点混乱。

--EOF--.

bash如果输入不匹配的文本,则报告语法错误并退出。

).

这些点对你来说可能并不重要,如果你想把它当作一个预定的任务来运行,那么它将被限制在一条命令或一小部分命令上,而这些命令永远不会以这种病态的方式运行。

编辑:在Linux上运行此程序后,改进退出处理和其他小的更改。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/383007.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java中if 运算符_[Java]Java基本语法结构(运算符,流程控制语句,if语句)

1:运算符(掌握)(1)算术运算符A:,-,*,/,%,,--B:的用法a:加法b:正号c:字符串连接符C:/和%的区别数据做除法操作的时候,/取得是商,%取得是余数D:和--的用法a:他们的作用是自增或者自减b:使用**单独使用放在操作数据的前面和后面效果一样。a或者a效果一样。*…

java 变量取值范围_JAVA中的变量及取值范围

字节是二进制数据的单位。一个字节通常8位长。但是,一些老型号计算机结构使用不同的长度。为了避免混乱,在大多数国际文献中,使用词代替byte。变量:变量的数据类型;变量名变量值数据类型基本型数值型(整数)布尔型浮点型…

java object强制类型转换_scala object 转Class Scala强制类型转换

asInstanceOf[T]将对象类型强制转换为T类型。还是由于泛型存在类型擦除的原因,1.asInstanceOf[String]在运行时会抛出ClassCastException异常,而List(1).asInstanceOf[List[String]]将不会。packageresti.webimportorg.springframework.beans.factory.annotation.Au…

java毛玻璃_模糊效果(毛玻璃效果)

模糊效果(毛玻璃效果)效果演示:1. 使用iOS自带的 UIImageImageEffects 文件文件中有这么几个方法:- (UIImage *)applyLightEffect;- (UIImage *)applyExtraLightEffect;- (UIImage *)applyDarkEffect;- (UIImage *)applyTintEffectWithColor:(UIColor *)…

java程序崩溃怎么重启_android 异常崩溃后 重启app(进程守护方式实现)

【实例简介】【实例截图】【核心代码】package com.sunfusheng.daemon.sample;import android.content.ComponentName;import android.content.Intent;import android.os.Looper;import android.util.Log;import com.blankj.utilcode.util.AppUtils;import com.sunfusheng.daem…

mysql 存储过程 循环结构 命名_mysql存储过程----循环结构

循环结构一共分为三种:三种循环结构分别为while、repeat、loop。while循环语法while 表达式(如果表达式为true则执行业务逻辑,否则不执行,与repeat循环相反,repeat循环满足表达式退出循环,不满足一直执行) do业务逻辑e…

mysql 组合索引 or_Mysql_组合索引和单列索引

一、目标什么时候使用组合索引,什么时候使用单独索引组合索引、单独索引区别组合索引:最左前缀匹配原则二、前期数据准备1. 建表CREATE TABLE user (uidint(11) NOT NULLAUTO_INCREMENT,namevarchar(50) DEFAULT NULL,pwdvarchar(50) DEFAULT NULL,creat…

mysql与mangodb多租户_MongoDB多租户(Java):如何使用MongoClient在运行时切换具有不同数据库凭据的MongoDB数据库?...

我正面临一个关于MongoDB多租户的问题.我有两个不同的mongoDB数据库(db1和db2).这两者都有不同的凭据.db1凭据:userName:admin密码:passwddb2凭据:userName:admin1密码:passwd1我需要在运行时从一个数据库切…

python 库 全局变量_python局部变量和全局变量global

当你在函数定义内声明变量的时候,它们与函数外具有相同名称的其他变量没有任何关系,即变量名称对于函数来说是 局部 的。这称为变量的 作用域 。所有变量的作用域是它们被定义的块,从它们的名称被定义的那点开始。使用局部变量例7.3 使用局部…

java 自省_自知 自省 自立 自信 自尊 自治 自强 自制

自知 自省 自立 自信 自尊 自治 自强 自制能知人者有智力,能自知才是真正的智者;能战胜别人者有力量,能战胜自己才是真正的强者;能知足者就是富有,能勤奋顽强坚持才是真正的有志者;不失其立足之地的人可以长…

java中json重复数据结构_JAVA把各种数据结构转换为JSON格式

Java代码import java.lang.reflect.Field;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;import java.util.ArrayList;import java.util.HashMap;import java.util.Iterator;import java.util.List;import java.util.Map;import net.sf…

字节字符区别Java_【JAVA基础】字符数组与字节数组的区别

String.getBytes()和String.tocharArray(),字节数组和字符数组的区别String.getBytes()是将字符串转化为一个字节数组。而String.toCharArray()是将一个字符串转化为一个字符数组。【例如】byte bys[] “国庆60周年”.getBytes();char chs[]“国庆60周年”.toCharAr…

mysql日志管理_关于MySQL的日志管理(binlog)

关于MySQL的日志管理(binlog)一、查看binlog的启用状态最常用的mysql版本是5.7,默认不开启binlog,可以在登录mysql之后,利用以下命令查看当前的binlog启用状态:mysql show variables like "%log_bin%";图中显示“ON”&a…

java精确测量文本高度_基于文本精确计算UITableViewCell的高度

我正在开发一个ios应用程序,并使用autolayout我正在尝试创建一个具有不同行高的表视图 .原型单元的布局如下:我有一个主单元格(黑色)里面有一个UIView(红色),里面有一个UILabel(蓝色)我添加的Autolayout约束如图所示:The UIView h…

php做一个微信退款,PHP实现微信退款功能

大家好,我是小编,最近在调微信退款接口,发现有许多坑,更大家分享一下① 要是在测试的时候,网页提示 curl 58 说明 证书的路径出现问题(这里要填物理路径,也就是绝对路径)②网页提示curl 52 说明你的证书引入…

php显示时间,php实现用已经过去多长时间的方式显示时间

本文实例讲述了php用已经过去多长时间的方式显示时间的方法。分享给大家供大家参考。具体如下:这里以一种可读性比较好的方式显示已经过去多长时间,比如:距离现在10秒,距离现在1天等等。function time_is_older_than($t, $check_t…

java中日期计算时间差,java中依据,两个日期,计算时间差

java中根据,两个日期,计算时间差。分别获取两个时间的毫秒数Date.getTime(),相减,得到的值/1000为秒数,/60*1000为分钟数,/60*60*1000为小时数。/*** 计算时间差** param begin* param end* return*/public…

php获取token失败,微信开发,老是获取token失败

微信开发,总是获取token失败$appid wx1aabc8673b8f103a;$appsecret 9aa99fc9db9bf1321c1afe05feb29b6c;$url "https://api.weixin.qq.com/cgi-bin/token?grant_typeclient_credential&appid$appid&secret$appsecret";$urlhttps://api.weixin.…

2008下php上传文件崩溃,php – 当用户反复尝试上传无效文件类型时,网站崩溃

我试图理解错误……我有一个允许用户上传CSV的网络应用程序.如果文件类型不是CSV,则不会发生任何操作,页面只显示“无效的文件类型”.如果用户尝试上载无效的文件类型并反复单击触发处理上载的PHP文件的按钮,则PHP文件最终会无响应,并且网站崩溃时出现以下错误:&quo…

java错误1601解决方法,求助解决错误

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1610)at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1590)at …