【问题标题】:ProcessBuilder - hanging on the readLine() methodProcessBuilder - 挂在 readLine() 方法上
【发布时间】:2013-12-10 15:46:58
【问题描述】:

运行以下简单程序:

    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 不确定是否已经到达终点。有没有办法解决这个问题并正确读取输入流?顺便提一句。 processbuilder 上的inheritIO 方法导致了同样的问题...

更新

这个:

 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");

也无限挂起...

【问题讨论】:

    标签: java process processbuilder


    【解决方案1】:

    Powershell 没有结束。我可能会使用 Java 列出目录,但这应该适用于您的示例。

    ProcessBuilder pb = new ProcessBuilder("dir");
    

    【讨论】:

    • 所以我需要在最后提供exit之类的东西?
    • 我想您可以改为关闭标准输出(来自 PowerShell)。
    【解决方案2】:

    我遇到了挂在 readline() 上的 processbuilder 的问题

    具体来说,Windows 10,运行 cmd.exe 命令来启动 bash 并运行脚本。

    通过关闭进程的输入解决了问题:

         Process process = pb.start();
         process.getOutputStream().flush();
         process.getOutputStream().close();
    

    【讨论】:

      【解决方案3】:

      不确定是什么问题。我尝试使用您的代码创建一个新项目(在一些 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
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-12-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-17
        相关资源
        最近更新 更多