2013-08-25 34 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