编写一些用于在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)
答案 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]);