2014-10-21 2 views
1

Я в настоящее время создаю инструмент разработки графического интерфейса Firefox с помощью Java. Однако я застреваю при попытке получить вывод файла .bat.Runtime.getRuntime не удалось получить вывод в то же время, но позже

Когда я запускаю файл .bat с помощью java, я могу видеть результат, но в файле bat есть 3 команды. Когда выполняется первая команда, я могу получить вывод одновременно. Но когда он выполняет второй вывод команды, он не подходит. И когда существует файл .bat, я получаю весь вывод, который не приходил одновременно.

Я получаю выход сразу после его выполнения:

call "C:\mozilla-build\addon-sdk-1.16\bin\activate.bat 

Но я не получаю выход одновременно для следующей команды:

call cfx run 

Но я знаю, что это исполнение, потому что окно светлячок всплывает , Я получаю все выходные внезапно, когда я исполняю proc.destroy();

Это моя летучая мышь файл:

@echo off 
call %1 
cd C:\Users\Madhawa.se\Desktop\workingfox\beauty 
call cfx run 
pause 

Это мой Java-код:

Thread t = new Thread(new Runnable() { 

    @Override 
    public void run() { 
     try { 
      Runtime rt = Runtime.getRuntime(); 

      String[] commands = {"C:\\Users\\Madhawa.se\\Desktop\\workingfox\\runner\\foxrun.bat", "C:\\mozilla-build\\addon-sdk-1.16\\bin\\activate.bat"}; 

      proc = rt.exec(commands); 

      BufferedReader stdInput = new BufferedReader(new InputStreamReader(proc.getInputStream())); 

      BufferedReader stdError = new BufferedReader(new InputStreamReader(proc.getErrorStream())); 

      // read the output from the command 

      String s = null; 
      while ((s = stdInput.readLine()) != null) { 
       System.out.println(s); 
      } 

      // read any errors from the attempted command 
      while ((s = stdError.readLine()) != null) { 
       System.out.println(s); 
      } 
      proc.waitFor(); 
      System.out.println("success"); 
     } catch (Exception ex) { 
      ex.printStackTrace(); 
     } 
    } 
}); 
t.start(); 

Как сразу получить выход и почему он действует по-разному для этой команды?

+2

Выход буферизуется и может остаться в буфере, пока ваш пакетный файл висит в команда 'pause', которая ждет ввода клавиатуры. Но кроме того, я рекомендую использовать ['ProcessBuilder'] (http://docs.oracle.com/javase/7/docs/api/java/lang/ProcessBuilder.html) вместо' Runtime.exec'. Используя ['inheritIO()'] (http://docs.oracle.com/javase/7/docs/api/java/lang/ProcessBuilder.html#inheritIO()), вы можете пропустить весь «прочитанный канал и копию» в stdout ". Вы можете просто сказать «новый ProcessBuilder (команды) .inheritIO(). Start(). WaitFor()'. – Holger

ответ

0

я был в состоянии исправить это с помощью process builder вместо runtime.execinheriteIo не работает .Это блокирует выходной сигнал в реальном масштабе времени

Thread t = new Thread(new Runnable() { 
    private String s; 

    @Override 
    public void run() { 
     try { 

      Component selectedComponent = jTabbedPane2.getSelectedComponent(); 
      if (selectedComponent instanceof MyTextArea) { 
       String response = ""; 
       System.out.println("yes"); 
       MyTextArea temptextarea = (MyTextArea) selectedComponent; 
       String xpiPath = new File(temptextarea.getNameX()).getParentFile().getPath(); 

       String[] commands = {"C:\\Users\\Madhawa.se\\Desktop\\workingfox\\runner\\foxrun.bat", "C:\\mozilla-build\\addon-sdk-1.16\\bin\\activate.bat 

       ProcessBuilder process = new ProcessBuilder(commands); 
       process.redirectErrorStream(true); 

       Process shell = process.start(); 

       //shell.waitFor(); 
       BufferedReader stdInput = new BufferedReader(new InputStreamReader(shell.getInputStream())); 
       BufferedReader stdError = new BufferedReader(new InputStreamReader(shell.getErrorStream())); 

       // read the output from the command 
       System.out.println("Here is the standard output of the command:\n"); 
       while ((s = stdInput.readLine()) != null) { 
        System.out.println("s:" + s); 
       } 

       // read any errors from the attempted command 
       System.out.println("Here is the standard error of the command (if any):\n"); 
       while ((s = stdError.readLine()) != null) { 
        System.out.println("w:" + s); 
       } 
      } 

     } catch (Exception ex) { 
      ex.printStackTrace(); 
     }