java - 当批处理的输出太大时,Process.getErrorStream() 不起作用

标签 java batch-file

static String getTime(String command) throws IOException, Throwable{
    try{
        String completeComm=Userdir+"\\timer.bat";
        Process p=Runtime.getRuntime().exec("cmd /c "+completeComm+" "+command+" --batch");

        BufferedReader reader=new BufferedReader (new InputStreamReader(p.getInputStream()));       

        LineIterator l=IOUtils.lineIterator(reader);            
        try {
            while (l.hasNext()) {
                String line = l.nextLine();
                System.out.println(line);
                ...
                }
            }
        } finally {
            LineIterator.closeQuietly(l);
        }

        BufferedReader Ereader=new BufferedReader (new InputStreamReader(p.getErrorStream()));
        LineIterator El=IOUtils.lineIterator(Ereader);          
        try {
            while (El.hasNext()) {
                String line = El.nextLine();
                System.out.println(line);
                ...
                }
            }
        } finally {
            LineIterator.closeQuietly(El);
        }


    }catch(Exception e){
        JOptionPane.showMessageDialog(null, e.getMessage());
        System.exit(0);
    }
}

我的问题是“p.getStreamError”。仅当我的批处理文件的输出/结果不是数百或数千行时,我才能看到 p.getStreamError 的输出,否则我不会得到任何输出(p.getSTreamError)。

  1. 为什么当我的批处理的返回结果/数据很大时,我无法从 p.getStreamError 获得任何输出?

  2. 当我创建一个 jar 并运行它时,程序永远挂起。我调试了它,发现它卡在了“while (El.hasNext())”处。为什么程序在通过 jar 运行时挂起并在 eclipse 中运行良好?

谢谢!

最佳答案

您需要为 while 循环使用单独的线程。

考虑创建一个实现 Runnable 的 StreamGobbler 类,该类在其构造函数中采用 InputStream,并且在其 run 方法中具有您的 while 循环。然后用这些 Gobbler 创建线程并让它们运行。

类似于:

public class StreamGobbler implements Runnable {
   private static String userdir;
   private String name;
   private LineIterator lineIterator;

   public StreamGobbler(String name, InputStream inStream) {
      this.name = name;
      BufferedReader bufReader = new BufferedReader(new InputStreamReader(
            inStream));
      lineIterator = IOUtils.lineIterator(bufReader);
   }

   @Override
   public void run() {
      try {
         while (lineIterator.hasNext()) {
            String line = lineIterator.nextLine();
            System.out.println(line);
            // ...
         }

      } finally {
         LineIterator.closeQuietly(lineIterator);
      }

   }

   public String getName() {
      return name;
   }
}

然后它可以像这样使用:

String completeComm = userdir + "\\timer.bat";
Process p = Runtime.getRuntime().exec(
       "cmd /c " + completeComm + " " + command + " --batch");
new Thread(new StreamGobbler("InputStream", p.getInputStream())).start();
new Thread(new StreamGobbler("ErrorStream", p.getErrorStream())).start();

关于java - 当批处理的输出太大时,Process.getErrorStream() 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20294336/

相关文章:

Java 2D 游戏 : Cant get collisions right

batch-file - 如何从 ffmpeg 到 ffplay 寻求 ffplay 或管道

windows - 当远程计算机可能是 Windows 7 或 XP 时,如何将文件复制到远程计算机的桌面?

windows - 批量 |回显多个变量到文件

java - 欧拉计划 #19 - 少了 2 个

java - 使用 LDT 时出现子记录错误

java - 如何将方法参数值直接存储到数组列表中,然后将其传递给另一个方法

java - Apache CXF (JAX-RS) 与 Spring Javaconfig 和 Jackson

batch-file - 如何使用批处理将单个空格键写入txt文件

windows - 使用批处理脚本进行字符串解析