Java 和cmd实时交互 管道通信?

废话不多说看注释

package com.demo.www;

import java.io.OutputStream;
import java.lang.String;

import java.io.IOException;
import java.io.InputStream;
import java.util.Scanner;

/*****7

 * @jjw QQ223783751 * 网上百度一大堆总结得方法就是用runtime 但是exec后用in.read 好像线程被挂起了
 * 转载请注明出处
 * 后面我想到c肯定可以操作得去百度发现了管道通信代码
 * 通过阅读代码发现 错误就错误在网上说得 如果没把三个流(getInputStream getOutputStream getErrorStream )处理干净会挂起 线程
 * 从我得代码中多次调试我发现并不是这个问题,我想到得就是 in.read 会一直在读东西直到有内容被读到 启发来自     Scanner sc = new Scanner(System.in);
 *经过多次探索确定了这个问题   那么问题就出在输出流,于是我尝试了,还是不行,最后通过网上得c++ 管道通信看到了原因就是输出流只输出没做回车动作
 * 那么到此问题解决    在windos系统中 \r\n 回车    不同系统得换行符号参考   CRLF、CR、LF
 * */
public class DemoMian {

    public static void main(String[] args) throws IOException, InterruptedException {
        String [] params={"cmd"};
        Process process=  runCmd(params);
        CmdInThread cmdInThread=new CmdInThread("cmdInThread",process);
        cmdInThread.start();

        CmdOutThread cmdOutThread=new CmdOutThread("CmdOutThread",cmdInThread,process);
        cmdOutThread.start();

    }

    public static  Process  runCmd(String [] cmd) throws IOException, InterruptedException {
         Runtime runtime=Runtime.getRuntime();
         Process pro=Runtime.getRuntime().exec(cmd);
         return  pro;
    }

}

class CmdInThread extends Thread{
    private   Process process;
    private  int num=1;
    public CmdInThread(String name,Process process) {
        super(name);
        this.process=process;
    }

    @Override
    public synchronized void run() {
        while (true){
            try {
                InputStream in =process.getInputStream();
//                OutputStream outputStream=process.getOutputStream();
                //读入数据
                byte[] data = new byte[1024];
                int readlen = in.read(data);
                System.out.println(  new String(data,"gb2312"));
//                System.out.println(process.isAlive());
//                String  sss="hostName \r\n";
//                outputStream.write(sss.getBytes());
//                outputStream.flush();
//                this.wait();
            }catch (IOException i){
                System.out.println(i.getMessage());
            }
        }

    }
}


class CmdOutThread extends Thread{
    private CmdInThread cmdInThread;
    private   Process process;

    public CmdOutThread(String name, CmdInThread cmdInThread, Process process) {
        super(name);
        this.cmdInThread = cmdInThread;
        this.process = process;
    }

    @Override
    public void run() {
        while (true){
            Scanner sc = new Scanner(System.in);
            String code=sc.nextLine() +" \r\n";
            OutputStream out=process.getOutputStream();
            try {
                out.write(code.getBytes());
                out.flush();
//                synchronized (cmdInThread){
//                    cmdInThread.notify();
//                }

            } catch (IOException e) {
                e.printStackTrace();
            }
            System.out.println(code);
        }
    }
}

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值