2013-08-25 32 views
0

在Linux下编写一些用于运行文本可执行文件的Java代码,我有一个问题需要打印出它的输出。这个可执行文件实际上是一个nmap -sP,因此接收参数。如何读取Java中exec进程的输出?

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

这是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与,它总是打印在控制台上,类似于第一行:

Starting Nmap 5.2 1(http://nmap.org)在2013年8月25日02:09 CDT

+0

您需要阅读过程的InoutStream(这是来自过程的输出),[例如](http://stackoverflow.com/questions/16093754/how-do-i-execute-a-序列相关控制台命令/ 16094810#16094810)和[例子](http://stackoverflow.com/questions/11893469/java-execute-a-program-with-options-like-ls-l/11893495 #11893495)。一个将流程的输出直接输出到标准输出,另一个使用一个线程读取InputStream,以便不阻塞当前线程 – MadProgrammer

回答

0

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

1

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

方法P = r.exec( “/家/ diegoaguilar /升降梭箱/ Buap/SO /的file.exe ”+ ARGS [0] + ARGS [1] +“> temp.output”);

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

+0

我做了,但是temp.output文件会去哪里?它不在本地目录中,也不在上面的目录中。 – diegoaguilar

+0

它可以在目录“/ home/diegoaguilar/Dropbox/Buap/SO /”中,否则你也可以为temp文件提供完整路径,如/home/myname/temp.output。 – Lokesh

+0

我认为它会去当前目录,但它不是,我会尝试通过给路径。 – diegoaguilar

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

我甚至找不到'LogStreamReader'类的正确导入类 – diegoaguilar

+0

我提到“LogStreamReader是我的自定义线程来读取流。”。让我知道你是否需要更多的帮助。我可以分享我的课程 – hImAnShU