2013-12-10 6 views
1

Running следующую простую программу:ProcessBuilder - висит на методе ReadLine()

ProcessBuilder pb = new ProcessBuilder("powershell.exe", "-Command", "dir"); 
    Process p = pb.start(); 
    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(p.getInputStream())); 
    String line; 
    while((line = bufferedReader.readLine()) != null){ 
     System.out.println(line); 
    } 

    System.out.println("Exit"); 

Никогда не достигает "Выход" Println - просто висит бесконечно по методу readLine(). Я понимаю, что это (скорее всего) связано с тем, что powershell не выводит \n в последней строке, а readLine не уверен, достигнут ли конец или нет. Есть ли способ преодолеть эту проблему и правильно прочитать входной поток? КСТАТИ. inheritIO метод на ProcessBuilder привело к тому же вопросу ...

UPDATE

Это:

ProcessBuilder pb = new ProcessBuilder("powershell.exe", "-Command", "dir"); 
     pb.redirectErrorStream(true); 
     Process p = pb.start(); 
//  BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(p.getInputStream())); 
//  String line; 
//  while((line = bufferedReader.readLine()) != null){ 
//   System.out.println(line); 
//  } 
    p.waitFor(); 
    System.out.println("Exit"); 

висит Также бесконечно ...

ответ

1

Powershell не заканчивается. Я бы, вероятно, использовал Java, чтобы перечислить каталог, но это должно работать с вашим примером.

ProcessBuilder pb = new ProcessBuilder("dir"); 
+0

Так что мне нужно предоставить sth как 'exit' в конце? – Bober02

+0

Я полагаю, вы можете закрыть stdout вместо этого (из PowerShell). –

0

Не знаете, в чем проблема. Я попытался создать новый проект с вашим кодом (добавлен в несколько утверждений try-catch и print), и он работает для меня. Вот что я использовал;

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 


public class temp { 

    public static void main(String[] args) { 
     ProcessBuilder pb = new ProcessBuilder("powershell.exe", "-Command", "dir"); 
     Process p; 
     try { 
      p = pb.start(); 
     } catch (IOException e) { 
      System.out.println("Failed to start powershell"); 
      return; 
     } 
     BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(p.getInputStream())); 
     String line; 
     System.out.println("Begin!"); 
     try { 
      while((line = bufferedReader.readLine()) != null){ 
       System.out.println("reading..."); 
       System.out.println(line); 
      } 
     } catch (IOException e) { 
      System.out.println("Failed to read line"); 
      return; 
     } 

     System.out.println("Exit"); 

    } 

} 

А вот полученный вывод на консоль,

Begin! reading... 

reading... 

reading... 
    Directory: C:\Users\AbrahamV\workspace\201_stackoverflow reading... 

reading... 

reading... Mode    LastWriteTime  Length Name   reading... 
----    -------------  ------ ----                  reading... d----  12/10/2013 9:29 PM   bin   reading... d----  12/10/2013 9:27 PM   src   reading... 
-a---  12/10/2013 9:27 PM  232 .classpath                 reading... 
-a---  12/10/2013 9:27 PM  393 .project                 reading... 

reading... 

Exit 

Выход не был мгновенным. За несколько секунд до того, как что-то было распечатано.

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