2016-03-01 5 views
-1
Process p = Runtime.getRuntime().exec("myexe.exe"); 

    BufferedReader br = null; 
    try{ 
     br = new BufferedReader(new InputStreamReader(p.getInputStream(),  "GB2312")); 
     String value = null; 
     while ((line = br.readLine()) != null) { 
      System.out.println(line); 
     } 
    }finally{ 
     IOUtils.close(br); 
    } 

Затем выход любит ниже, а не строка, я хочу:Запуск EXE с помощью Java процесса, получить код ошибки 109

Ребенок: Не удается прочитать длину данных, код ошибки 109

+2

Разве это не зависит от вашей программы myexe.exe? –

+0

Не могли бы мы получить дополнительную информацию об EXE, которую вы пытаетесь запустить, и полную ошибку? –

+2

Я бы использовал 'ProcessBuilder' и перенаправил ошибку ввода-вывода через stdout, а затем попробовал и прочитал ответ – MadProgrammer

ответ

2

Кажется, что проблема возникает из-за выхода exe, который слишком длинный. Может ли ProcessBuilder решить эту проблему?

Как общее правило, вы должны всегда читать вывод Process перед вызовом waitFor (или использовать фоновый Thread, чтобы прочитать его, пока вы waitFor)

import java.io.File; 
import java.io.IOException; 
import java.io.InputStream; 

public class PBDemo { 

    public static void main(String[] args) throws Exception { 
     String s; 
     ProcessBuilder pb = new ProcessBuilder("myexe.exe"); 
     pb.redirectErrorStream(true); 
     try { 
      Process pro = pb.start(); 
      InputConsumer ic = new InputConsumer(pro.getInputStream()); 
      System.out.println("...Waiting"); 
      int exitCode = pro.waitFor(); 

      ic.join(); 

      System.out.println("Process exited with " + exitCode); 

     } catch (Exception e) { 
      System.out.println("sorry" + e); 
      e.printStackTrace(); 
     } 
    } 

    public static class InputConsumer extends Thread { 

     private InputStream is; 

     public InputConsumer(InputStream is) { 
      this.is = is; 
      start(); 
     } 

     @Override 
     public void run() { 
      try { 
       int in = -1; 
       while ((in = is.read()) != -1) { 
        System.out.print((char) in); 
       } 
      } catch (IOException exp) { 
       exp.printStackTrace(); 
      } 
     } 

    } 

} 

В прошлом я либо предоставил Observer Pattern на номер InputConsumer, через который какая-либо другая сторона может быть уведомлена по мере ввода нового ввода или другого кэширования вывода, чтобы я мог обработать его после завершения процесса в соответствии с вашими потребностями.

+0

Спасибо, вы правы насчет '' ожидания''. Но проблема слишком длинных выходных данных не решена. –

+0

Является ли exe-файл основанным на python? Без каких-либо идей относительно того, что делает exe или как это работает, это будет самое лучшее, что мы можем сделать. – MadProgrammer

+0

Вы также можете попробовать использовать ['ProcessBuilder # inheritIO'] (https://docs.oracle.com/javase/8 /docs/api/java/lang/ProcessBuilder.html#inheritIO--), прежде чем вы начнете процесс – MadProgrammer

Смежные вопросы