java 父进程获取子进程的输出 ,父子进程通信,(标准输入输出)

应用场景:B进程负责处理数据,结果输出在标准输出中,A进程作为B的父进程去启动B进程,A可以获取到B进程的stdout,stderr.这样做的好处是解耦,假设B进程是java语言开发,那么A进程可以是shell,可以是c++也可以是python. 这样就做到了解耦.   原理就是父子进程通信.  这种通信方式是pip管道通信. 对进程通信想要详细了解的同学可以去查阅相关资料.这里我写了个简单的demo,父子进程都是java版本.

1:父进程代码

import java.io.*;
//process.getInputStream是用来读取控制台命令结果的   控制台数据的流入可以往System.out
//process.getOutputStream是用来往控制台写入数据的   此结果可以由System.in端读出
public class Father {
    public static void main(String[] args) throws IOException {
        Runtime run = Runtime.getRuntime();
//      获取java执行命令所在的位置
        String java = System.getProperty("java.home") + File.separator + "bin" + File.separator + "java";
//      获取类加载的时候的加载的class文件的路径,返回结果是一个string,多个路径之间用";"分割.
        String cp = "\"" + System.getProperty("java.class.path");
//      获取当前程序的class文件所在的位置
        cp += File.pathSeparator + ClassLoader.getSystemResource("").getPath() + "\"";
//        java -cp 命令   (这是运行class文件的命令,会将class文件载入jvm)
        String cmd = java + " -cp " + cp + " connect.test2.Child";
//        开启一个子进程
        Process child_process = run.exec(cmd);
//      往子进程写数据
        DataOutputStream dataOutputStream = new DataOutputStream(child_process.getOutputStream());
        dataOutputStream.writeUTF("hello child");
        dataOutputStream.close();//注意这个close方法,写完之后记得关闭
        System.out.println("写出成功");
//     父进程获取子进程控制台数据
        DataInputStream dataInputStream= new DataInputStream(child_process.getInputStream());
        while (true){
            String line = dataInputStream.readUTF();
            System.out.println(line);
            if(line.contains("end")){
                break;
            }
        }
        dataInputStream.close();



    }
}

2.子进程代码

package connect.test2;

import java.io.*;
//其实System.out是一个流对象:源码:public class PrintStream extends FilterOutputStream
//System.out.println("")其实是PrintStream.print()
public class Child {
    public static void main(String[] args) throws IOException, InterruptedException {
//        子进程获取父进程的数据
        DataInputStream dataInputStream =new DataInputStream(System.in);
        String line = dataInputStream.readUTF();
//        将子进程的数据输入到子进程的控制台
        DataOutputStream dataOutputStream = new DataOutputStream(System.out);
        dataInputStream.close();
        for(int i=0;i<2;i++) {
//            数据将流入当前进程的控制台也就是System.out
            dataOutputStream.writeUTF("hi" + line);
        }
        dataOutputStream.writeUTF("end");
        dataOutputStream.close();


    }

}

 

 

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我先森

鼓励一个吧,哈哈

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值