在Java程序中可能需要调用底层操作系统上的其他程序,Java标准API提供了创建底层操作系统上运行的进程的能力,只需要传入正确的命令和相关的参数,就可以启动一个进程。在进程启动之后,可以从Java程序向进程提供输入数据,以及读取进程运行过程中产生的输出数据。对于在Java程序中启动其他进程这个任务来说,最重要的是输入和输出的处理。通常的做法是把Java程序的内部运行结果作为输入传递给一个新创建的进程,然后等待进程执行完成。在得到进程输出的运行结果之后,再继续下面的处理。通过这种方式,底层操作系统上的其他进程可以很好地与Java程序集成起来。
在Java7之前,对进程的输入和输出进行处理的方式比较有限,只支持管道式的方式。进程的输入对Java程序来说是一个输出流,程序向这个输出流中写入的数据会通过管道传递给进程。同样的,进程的输出对于java程序来说是一个输入流,通过读取此输入流的内容获得进程的输出。标准的创建新进程的过程是使用:java.lang.ProcessBuilder类来设置新进程的属性,然后通过start方法来启动进程的执行。ProcessBuilder类的start方法的返回值是一个表示进程的java.lang.Process类的对象。通过Process类的getOutputStream方法可以得到向进程写入数据的输出流,而通过getInputStream和getErrorStream方法可以分别得到包含进程正常执行和出错时输出内容的流入流。如下示例:
public void startProcessNormal() throws IOException { ProcessBuilder pb = new ProcessBuilder("cmd.exe","/c","netstat","-a"); Process process = pb.start(); InputStream input = process.getInputStream(); Files.copy(input,Paths.get("netstat.txt"),StandardCopyOption.REPLACE_EXISTING); }
使用管道的方式在某些情况下显得不够灵活,因此java7对进程的输入和输出
时间: 2024-10-12 10:32:22