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);
}
}