使用exec启动其他进程时可能出现的问题

news/2024/7/8 5:36:08 标签: byte, null, 图形, java

java程序中用Runtime.getRuntime().exec()启动别的运行程序Pro2并调用waitFor()
   等待其运行结束时,如果Pro2程序向标准输出或错误信息输出端打印信息的话,可能
   导致Pro2不能正常运行(比如图形界面无法显示必须等到父程序退出时才能显示)。
   这可能是由于这些信息阻塞了程序,将这些信息读掉是一个不怎么好的办法,下面是
   一个实例,不过有漏洞。

   execProcess = Runtime.getRuntime().exec(pro2);

   InputStream stderr = null;
   InputStream stdin = null;
   byte[] buf = new byte[1024];
   int len1 = 0, len2 = 0;

   stdin = execProcess.getInputStream();
   stderr = execProcess.getErrorStream();
   while ( (len1 = stdin.available()) > 0 ||
           (len2 = stderr.available()) > 0) { //可能某个时刻恰好都没有,但程序后面会产生
        while (len1 > 0) {
             if (len1 > 1024) {
                 stdin.read(buf, 0, 1024); //也可能会发生阻塞
                 len1 -= 1024;
             }
             else {
                 stdin.read(buf, 0, len1); //也可能会发生阻塞
                 len1 = 0;
             }
        }
        while (len2 > 0) {
            if (len2 > 1024) {
                stderr.read(buf, 0, 1024); //也可能会发生阻塞
                len2 -= 1024;
            }
            else {
                stderr.read(buf, 0, len2); //也可能会发生阻塞
                len2 = 0;
            }
        }
   }
   stderr.close();
   stdin.close();

   execProcess.waitFor();

将pro2的输出重定位到某个文件(比如日志文件),可能能更好地解决这个问题


http://www.niftyadmin.cn/n/1104529.html

相关文章

python2.0 和python3.0区别

python2.0 和python3.0区别 1.官方解释:python2.0是过去的遗产; python3.0是未来使用的。 (去繁从简)2.语法区别:python2.0 print "hello"python3.0 print ("hello")3.编码不同&#xff…

cat

cat命令 cat 命令用于连接文件并打印到标准输出设备上。 语法格式 cat [-AbeEnstTuv] [--help] [--version] fileName 参数说明: -n 或 --number:由 1 开始对所有输出的行数编号。 -b 或 --number-nonblank:和 -n 相似,只不过对于空白行不编号…

sshd安全加固小技巧

1234567# 修改sshd默认端口比如将默认端口22改为2222# 在默认配置文件 /etc/ssh/sshd_config 追加如下内容( 将arcfour cipher 停用)Ciphers aes128-ctr,aes192-ctr,aes256-ctr# 禁用弱MAC算法,在默认配置文件 /etc/ssh/sshd_config追加如下…

罗列一下看过而且喜欢的书

活这么大了,看了不少书,喜欢的书有不少,想想该列一下了,不断会补充吧,给自己一些成就感,也便于发现不足,呵呵。 经典文学:李汝珍的《镜花缘》、曹雪芹的《红楼梦》、孔子《大学》《中…

七 Hibernate5种查询检索方式,单表多表

Hibernate中提供了5种查询方式: OID查询对象导航查询HQL检索QBC检索SQL检索OID检索: Hibernate根据对象的oid(表中主键) 使用get方法 Customer customer new Customer(Customer.class , 1l);使用load方法对象导航检索: Hiberna…

更改应用程序的文件夹的路径(转)

根键位置:HKEY_USERS.DEFAULTSoftwareMicrosoftWindowsCurrentVersionExplorerUser Shell Folders修改内容:在右边的窗口中修改字符串“Recent”的键值为新的文件夹路径,如:C:cpu ,注意:cpu这个文件夹必须是存在的,否则…

3.[Think in Java笔记]持有对象

Java提供了大量持有对象的方法: 数组将数字与对象联系起来。它保存类型明确的对象,查询对象时,不需要对结果做类型转换。它可以是多维的,可以保存基本类型的数据。但是数组一旦生成,其容量就不能改变。 四种容器&#…

自信与自负

人贵有自知之明。 不论是自我评价,还是对别人进行评价,是“自信”还是“自负”都是一个较难的判断。 在经过千辛万苦地奋斗之后,一个项目的成功在给人以成就感的同时,也给人增添许多自信,随着自信地积累,大…