java—如何执行命令并实时流化其输出?

cwxwcias  于 2021-07-03  发布在  Java
关注(0)|答案(0)|浏览(216)

我有一个jframe程序。我想在jframe中执行一个命令重定向它的输出并打印结果。
我尝试过:

public void runConsoleCommand(String command)
    {
        try
        {
            System.setOut(this.printStream);
            System.setErr(this.printStream);
            System.out.println("testing 123....");
            String term = OSUtil.getTerminal();
            String close = OSUtil.getExeAndClose(OSUtil.osSimpleName);
            ProcessBuilder pb = new ProcessBuilder(new String[]{term, close, command});//TODO: wait until the process is done
            pb.inheritIO();
            Process process = pb.start();
            process.waitFor();
        }
        catch(Throwable e)
        {
            e.printStackTrace();
        }
    }

输出:它在jframe控制台中打印“testing 123….”,并在eclipse而不是jframe中打印其余部分。对于windows 10上命令提示符下的命令“帮助”
我正在使用jre 8。我注意到process builder Inheritario使用filedescriptor#out作为句柄长id。我认为它得到了错误的句柄。这是java错误吗?我做错什么了吗?有办法解决吗?
我的jframehttps://github.com/jredfox/filededuper/blob/main/src/jredfox/selfcmd/jconsole/jconsole.java
我的测试主类https://github.com/jredfox/filededuper/blob/main/src/jredfox/filededuper/debugcode.java
编辑:inheritio有一个jre错误,它重定向了输出、输入和错误。它是不可修复的,它与jni(java native something)返回第一个outputstream、inputstream或error流的确切代码有关。
我没有使用inheritio,我用jframe图形修复了一个bug,现在可以正常工作了。不过,我还是想知道为什么会发生这种错误。我使用反射进行了一些尝试并刷新了它,但是,本机filedescriptor#set方法返回了与最初相同的指针,因此如果不修复本机库,它实际上是不可修复的。

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题