【问题标题】:How to read the output of an exec process in Java?如何在 Java 中读取 exec 进程的输出?
【发布时间】:2013-08-25 07:25:23
【问题描述】:

编写一些 Java 代码以在 Linux 下运行文本可执行文件,我无法打印出它的输出。这个可执行文件实际上是一个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)

【问题讨论】:

  • 你需要读取进程的InoutStream(这是进程的输出),for exampleexmple。一个将进程的输出直接通过管道输出到标准输出,另一个使用线程读取 InputStream 以免阻塞当前线程

标签: java executable runtime.exec


【解决方案1】:

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

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

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

【讨论】:

  • 我做了,但是 temp.output 文件会去哪里?它不在本地目录中,也不在上一级目录中。
  • 它应该在目录“/home/diegoaguilar/Dropbox/Buap/SO/”中,否则您还可以为临时文件提供完整路径,例如 /home/myname/temp.output。
  • 我以为它会转到当前目录,但事实并非如此,我会通过给出路径来尝试。
【解决方案2】:

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

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

【讨论】:

  • 我什至找不到 LogStreamReader 类的正确导入
  • 我提到“LogStreamReader 是我的自定义线程来读取流。”。如果您需要更多帮助,请告诉我。我可以分享我的课程
【解决方案3】:

尝试将p.waitFor(); 放在Process p = r.exec("/home/diegoaguilar/Dropbox/Buap/SO/file.exe "+args[0]+args[1]); 之后

【讨论】:

    猜你喜欢
    • 2011-12-30
    • 1970-01-01
    • 1970-01-01
    • 2013-09-19
    • 1970-01-01
    • 2012-06-07
    • 2012-03-21
    • 1970-01-01
    相关资源
    最近更新 更多