Java代码执行liunx命令( Java虚拟机执行其他进程)

 Java虚拟机执行其他进程:

使用Runtime对象的exec()方法可以在运行平台上的其他程序,该方法产生一个Process对象,Process对象代表由该Java程序启动的子进程。

Process类提供了下面三个方法,用于让程序和其子进程进行通讯

InputStream getErrorStream() : 获取子进程的错误流(个人认为并不是指的错误流,可能就是子进程的输出流)

InputStream getInputStream() : 获取子进程的输入流

OutputStream getOutputStream() : 获取子进程的输出流

注意:上面说到的输入输出是站在主Java程序的角度看问题的。比如:

『获取子进程的输出流』,这里的输出流相对主Java程序是输出流,相对子进程p其实是输入流

『获取子进程的输入流』,这里的输出流相对主Java程序是输入流,相对子进程p其实是输出流

『获取子进程的错误流』,这里的错误流相对主Java程序是输入流,相对子进程p其实是输出流

 

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class ExecTest {
    public static void main(String[] args) {
        String javaFile =
                "/Users/qinwenjing/Documents/Projects/Test/src/main/java/IO/FileInputStreamTest.java";
        try {
            // 执行的结果得到一个对应文件的class文件
            // javac 是编译的命令,将源文件编译成Class文件
            Process p = Runtime.getRuntime().exec("java "+ javaFile);

            // 其他线程都等待这个线程完成,
            int waitRes = p.waitFor();
            System.out.println("waitRes = " + waitRes);

            // 获取输出结果
            InputStream inputStream = p.getInputStream();
            OutputStream outputStream = p.getOutputStream();
            InputStream errorInputStream = p.getErrorStream();

            // 这里显示为空
            String inputStr = inStreamToStr2(inputStream);

            // 输出流:只能向其中写入数据,而不能从中读数据,所以这种想读取输出流中的数据的方式是不对的
            String outputStr = outStreamToStr(outputStream);

            // 这里显示的是p进程输出的数据
            String errorInputStr = inStreamToStr2(errorInputStream);

            // 获取javac线程的退出值
            int ret = p.exitValue();
            System.out.println("ret = " + ret);

        } catch (IOException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public static String inStreamToStr(InputStream inputStream) throws IOException {
        if (inputStream == null) {
            return "inputStream is null";
        }
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        byte[] buffer = new byte[1024];
        int i = -1;
        while ((i = inputStream.read(buffer)) != -1) {
            baos.write(buffer, 0, i);
        }
        baos.close();
        inputStream.close();
        return baos.toString();
    }

    public static String inStreamToStr2(InputStream inputStream) throws IOException {
        if (inputStream == null) {
            return "inputStream is null";
        }
        StringBuffer content = new StringBuffer();
        byte[] buffer = new byte[1024];
        int i = -1;
        while ((i = inputStream.read(buffer)) != -1) {
            content.append(new String(buffer, 0, i));
        }
        inputStream.close();
        return content.toString();
    }

    public static String outStreamToStr(OutputStream outputStream) throws IOException {
        if (outputStream == null) {
            return "outputStream is null";
        }
        byte[] bytes = new byte[4096];
        outputStream.write(bytes);
        return new String(bytes);
    }

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值