java - 如何使用 ProcessBuilder 获取 wvdial 的输出?

标签 java ubuntu processbuilder

下面的代码打印执行进程的输出(使用不同的线程进行输出):

public static void main(String[] args) throws InterruptedException,
        IOException {
    ProcessBuilder builder = new ProcessBuilder("some_command");
    final Process process = builder.start();
    final Thread ioThread = new Thread() {
        @Override
        public void run() {
            try {
                final BufferedReader reader = new BufferedReader(
                        new InputStreamReader(process.getInputStream()));
                String line;
                while ((line = reader.readLine()) != null) {
                    System.out.println(line);
                }
                reader.close();
            } catch (final Exception e) {
                e.printStackTrace();
            }
        }
    };
    ioThread.start();
    process.waitFor();
}

所以,如果我用

运行这段代码
ProcessBuilder builder = new ProcessBuilder("ping","8.8.8.8");

输出将是这样的:

PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=57 time=205 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=57 time=202 ms
...

但是如果我跑

ProcessBuilder builder = new ProcessBuilder("wvdial");

然后命令将被执行(wvdial 将启动),但 BufferedReader 中不会有输出。终端中的 wvdial 显示输出文本。

为什么 wvdial 没有为 ProcessBuilder 提供输出?

最佳答案

也许它会写入stderrprocess.getErrorStream()

大多数 UNIX 程序都避免将人类的信息消息写入 stdout。特别是批处理程序。 stdout 用于程序结果、数据输出,而不是信息性消息。

您也许还能够理解退出代码,从而消除输出解析的需要。

关于java - 如何使用 ProcessBuilder 获取 wvdial 的输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33791351/

相关文章:

java - 为什么我的curl命令不能与Java ProcessBuilder API一起使用

java - 具有动态路径的 ProcessBuilder(可能带有空格)

java - 弦乐与表演

ubuntu - 如何关闭 Sublime 2 更新通知?

Docker 卷 mariadb 具有 root 权限

java - 如何从调用同一变量的两个线程中获取相同的值?

java - 有没有更好的方法来写这个?检查场景

java - 从 jTextPane 中删除最后一行

java - 如何使用jdbc从oracle DB获取时间戳

linux - udev 规则不触发 GUI 应用程序