2010-05-27 2 views
3
Process p; 
String line; 
String path; 
String[] params = new String [3]; 

params[0] = "D:\\prog.exe"; 
params[1] = picA+".jpg"; 
params[2] = picB+".jpg"; 

try 
{ 
    p = Runtime.getRuntime().exec(params); 

    BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream())); 

    while ((line = input.readLine()) != null) 
     System.out.println(line); 

    input.close(); 
} 
catch (IOException e) 
{ 
    System.out.println(" procccess not read"+e); 
} 

У меня нет никакой ошибки, просто ничего. В cmd.exe prog.exe работает нормально.Выполнение в Java-коде внешней программы, которая принимает аргументы

Что улучшить, чтобы этот код работал?

+3

Просто небольшое наблюдение: Java не C, вам не нужно объявлять переменные перед блоком кода. На самом деле иногда лучше объявить их внутри блока, так как тогда сборщик мусора будет легче очищать их. –

ответ

2

Возможно, вы должны использовать waitFor() для получения кода результата. Это означает, что сброс на стандартный вывод должно быть сделано в другом потоке:

String path; 
String[] params = new String [3]; 

        params[0] = "D:\\prog.exe"; 
     params[1] = picA+".jpg"; 
     params[2] = picB+".jpg"; 

     try { 
      final Process p = Runtime.getRuntime().exec(params); 
      Thread thread = new Thread() { 
       public void run() { 
        String line; 
        BufferedReader input = 
         new BufferedReader 
         (new InputStreamReader(p.getInputStream())); 

        while ((line = input.readLine()) != null) 
         System.out.println(line); 


        input.close(); 
       } catch (IOException e) {System.out.println(" procccess not read"+e);} 
      }; 
      thread.start(); 
      int result = p.waitFor(); 
      thread.join(); 
      if (result != 0) { 
       System.out.println("Process failed with status: " + result); 
      } 
+0

Я делаю результат float, и он равен: -1.0737415E9 – questioner

+0

Зачем делать его плавающим? В любом случае, это статус выхода prog.exe; это значение зависит от выполняемой программы. –

+0

yep, и это был код ошибки не нужно (в моем случае для слишком большого количества потоков), но теперь он работает Я не знаю, что произошло, но waitFor(); и Thread.sleep() был полезен при исследовании – questioner

3

Используйте p = new ProcessBuilder(params).start(); вместо

p = Runtime.getRuntime().exec(params);

Другие, чем выглядит отлично.

+0

Почему он должен использовать ProcessBuilder для выполнения одного процесса? –

+0

ProcessBuilder был написан для замены Runtime.exec и упрощает настройку процесса и обеспечивает лучший контроль над запуском процесса. Поскольку в его коде нет ничего другого, что было бы неправильно, казалось бы хорошим улучшением, как любой – Robert

1

Я просто попытался это на моей системе:

public static void main(String[] args) throws IOException { 
     String[] params = { "svn", "help" }; 
     Process p = Runtime.getRuntime().exec(params); 

     BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream())); 

     String line; 
     while ((line = input.readLine()) != null) { 
      System.out.println(line); 
     } 

     input.close(); 
    } 

и он работал отлично. Вы уверены, что программа, которую вы используете, действительно печатает что-то на консоль? Я вижу, что в качестве ввода требуется jpegs, возможно, он записывает файл, а не stdout.

+0

нет, он записывает на консоль, некоторые числа с плавающей запятой – questioner

+0

Скорее всего readLine() вызывается до того, как p действительно выдает что-либо, и возвращает null, в результате чего ваша программа завершается. Вам нужно подождать p. p.waitFor() может работать, как предположил Морис, но я попробовал это на своем примере, и он просто зависает при этом вызове (не возвращается). Вы также можете попробовать использовать Thread.currentThread(). Wait (10); перед циклом while и посмотреть, что-нибудь изменится (если это определенно проблема с синхронизацией). –

0

Так же, как чтение из входного потока процесса, вы можете также прочитать из потока ошибок, как это:

Process p; 
    String line; 
    String path; 
    String[] params = new String [3]; 

    params[0] = "D:\\prog.exe"; 
    params[1] = picA+".jpg"; 
    params[2] = picB+".jpg"; 

    try { 
     p = Runtime.getRuntime().exec(params); 

     BufferedReader input = 
      new BufferedReader 
       (new InputStreamReader(p.getInputStream())); 

     BufferedReader error = 
      new BufferedReader 
       (new InputStreamReader(p.getErrorStream())); 

      while ((line = input.readLine()) != null) 
       System.out.println(line); 


      while ((line = error.readLine()) != null) 
       System.out.println(line); 

      input.close(); 
      error.close(); 

    } catch (IOException e) { 
      System.out.println(" procccess not read"+e); 
    } 
Смежные вопросы