Inputstream ProcessBuilder输出挂起在readLine上

Inputstream ProcessBuilder输出挂起在readLine上,inputstream,processbuilder,freeze,Inputstream,Processbuilder,Freeze,我正在尝试使用ProcessBuilder运行一些命令,除了一个小细节外,其他一切都正常工作:在一种情况下,我只在任务完成运行后获得输出。我检查了程序,它挂在第一个readLine()上。我在不同的线程中运行它,我已经尝试将输入流和错误流与“redirectErrorStream(true)”合并,并将它们分开,而不改变所提到的行为。我还尝试了一个while循环,在BufferedReader为ready()返回true后,它只会执行第一个readLine(),但它没有起作用(可能不是一个非常聪

我正在尝试使用ProcessBuilder运行一些命令,除了一个小细节外,其他一切都正常工作:在一种情况下,我只在任务完成运行后获得输出。我检查了程序,它挂在第一个readLine()上。我在不同的线程中运行它,我已经尝试将输入流和错误流与“redirectErrorStream(true)”合并,并将它们分开,而不改变所提到的行为。我还尝试了一个while循环,在BufferedReader为ready()返回true后,它只会执行第一个readLine(),但它没有起作用(可能不是一个非常聪明的解决方案,但我正在尽一切努力了解发生了什么…)

该代码与某些可执行文件完美配合,在运行时提供输出,但在某些情况下挂起在第一个readline()上。。。有人知道是什么原因造成的以及如何解决吗

这对我来说有点奇怪,因为当我在命令提示符下执行相同的命令时,输出会在程序运行时显示

这个问题似乎与我在其他线程中发现的问题相同,但我在任何线程中都找不到解决方案

下面是我使用的代码,基于():

StreamBoozer:

public class StreamBoozer extends Thread {

private InputStream in;

StreamBoozer(InputStream in) {
    this.in = in;
}

@Override
public void run() {
    BufferedReader br = null;
    br = new BufferedReader(new InputStreamReader(in));
    try {
        String line = null;
        while ((line = br.readLine()) != null) {  <<<<<<<<<<<<< It hangs here #####
            System.out.println(line);
        }
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        try {
            br.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
}
公共类StreamBoozer扩展线程{
私有输入流;
StreamBoozer(输入流输入){
this.in=in;
}
@凌驾
公开募捐{
BufferedReader br=null;
br=新的BufferedReader(新的InputStreamReader(in));
试一试{
字符串行=null;

虽然((line=br.readLine())!=null){我认为您误解了list命令的构建。list不能用于多个命令。这意味着,您只能使用processbuilderrapper运行一个命令。 查看ProcessBuilder的Javadoc:

 command - a string array containing the program and its arguments
例如,对于“ls-al”,您应该使用:

 List command = new ArrayList();
 command.add("ls");
 command.add("-al");
如果您使用的是SteamBoozer stuff进程,则应使用waitFor和SteamBoozer.join(查看您上面提到的博客文章)。否则您可能会遇到糟糕的计时问题!这可能会导致您上面描述的奇怪行为

问候 蒂洛

 command - a string array containing the program and its arguments
 List command = new ArrayList();
 command.add("ls");
 command.add("-al");