2013-08-25 1 views
0

Написание кода Java для запуска текстового исполняемого файла в Linux, у меня есть проблема, чтобы распечатать его вывод. Этот исполняемый файл фактически является nmap -sP и поэтому принимает параметры.Как читать вывод процесса exec в Java?

Каждый раз, когда я вызываю скомпилированный класс, я вижу только первую выходную строку, но ничего больше.

Это файл 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 с , это всегда выводится на консоль что-то вроде первой линии:

Запуск Nmap 5.2 1 (http://nmap.org) в 2013-08-25 2:09 CDT

+0

Вы должны прочитать процесса в InoutStream (который является результатом процесса), [например] (http://stackoverflow.com/questions/16093754/how-do-i-execute-a- последовательности-консоли-команд/16094810 # 16094810) и [exmple] (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

Как насчет отправки вывод во временный файл, а затем читает этот файл.

Процесс р = r.exec ("/ главная/diegoaguilar/Dropbox/Buap/SO/file.exe "+ арг [0] + арг [1] +"> temp.output");

Теперь выход будет отправлен в файл temp.output, и вы сможете прочесть его легко.

+0

Я сделал, но куда будет идти файл temp.output? Это не в локальном каталоге, ни в верхнем. – diegoaguilar

+0

Он находится в каталоге «/ home/diegoaguilar/Dropbox/Buap/SO /», иначе вы также можете предоставить полный путь для временного файла, например /home/myname/temp.output. – Lokesh

+0

Я предположил, что он пойдет в текущую директорию, но это не так, я попробую указать путь. – diegoaguilar

1

Прочитайте входной поток и поток ошибок в отдельном потоке. Кроме того, подождите, пока потоки будут объединены. Это будет читать все сообщения, пока команда не будет выполнена.

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