2013-12-10 19 views
1

运行下面的程序:的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在最后一行中不输出\nreadLine不确定是否已达到末端。有没有办法解决这个问题并正确地读取输入流? BTW。上的ProcessBuilder inheritIO方法导致同样的问题...

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

所以我需要在最后提供'exit'这样的东西? – Bober02

+0

我想你可以关闭标准输出(来自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 

输出是不是瞬间。花了一些时间才打印出来。

相关问题