如何在Java中读取exec进程的输出?

时间:2013-08-25 07:25:23

标签: java executable runtime.exec

编写一些用于在Linux下运行文本可执行文件的Java代码,我有一个问题就是打印出它的输出。此可执行文件实际上是 nmap -sP ,因此接收参数。

每次我调用编译的类时,我只能看到第一个输出行,但没有别的。

这是runFile.java文件:

import java.lang.Runtime;
import java.lang.Process;
import java.io.*;
import java.lang.InterruptedException;

public class runFile {

    public static void main (String args[]) throws IOException, InterruptedException {


        Runtime r = Runtime.getRuntime();
        Process p = r.exec("/home/diegoaguilar/Dropbox/Buap/SO/file.exe "+args[0]+args[1]);
        InputStream stream = p.getInputStream();
        BufferedReader reader = new BufferedReader (new InputStreamReader(stream));
        String salida = reader.readLine();

        while (salida != null) {
            System.out.println(salida);
            salida = reader.readLine();
        }
        //p.waitFor();
    }


}

所以,这是file.exe的内容:

nmap -sP $segment1-$segment1

无论有什么参数,无论是否有效,我都会调用runFile,它总是会像第一行一样打印到控制台:

  
    

在2013-08-25 02:09 CDT

启动Nmap 5.21(http://nmap.org)   

3 个答案:

答案 0 :(得分:1)

如何将输出发送到临时文件然后读取该文件。

  

进程p = r.exec(“/ home / diegoaguilar / Dropbox / Buap / SO / file.exe   “+ args [0] + args [1] +”> temp.output“);

现在输出将转到temp.output文件,您应该可以轻松阅读。

答案 1 :(得分:1)

在单独的线程中读取inputstream和errorstream。另外,等待线程加入。这将读取所有消息,直到执行命令。

LogStreamReader是我读取流的自定义线程。

Runtime r = Runtime.getRuntime();
Process p = r.exec(cmd);

LogStreamReader lsr = new LogStreamReader(p.getInputStream(), "INPUT");
Thread thread = new Thread(lsr);
thread.start();
LogStreamReader lsr2 = new LogStreamReader(p.getErrorStream(), "ERROR");
Thread thread2 = new Thread(lsr2);
thread2.start();
thread2.join();
thread.join();

答案 2 :(得分:0)

尝试在p.waitFor();

之后加Process p = r.exec("/home/diegoaguilar/Dropbox/Buap/SO/file.exe "+args[0]+args[1]);