【问题标题】:Running piped script with Java使用 Java 运行管道脚本
【发布时间】:2013-02-06 18:27:37
【问题描述】:

我正在尝试这样做

echo "ls|head -3"|/bin/sh

在 Java 中。

重要的一点是我想即时创建脚本字符串并使用该脚本运行一个 shell 进程并捕获脚本标准输出。

上面的代码不起作用并挂起,可能在输入流上。

        Process p = Runtime.getRuntime().exec("/bin/sh");

        final OutputStream out = p.getOutputStream();
        final BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));

        final String cmd = "ls|head -3";

        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    out.write(cmd.getBytes());
                    out.flush();
                } catch (IOException ex) {
                }
            }
        }).start();


        final List list = new ArrayList();

        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    String line;
                    while ((line = in.readLine()) != null) {
                        list.add(line);
                    }
                } catch (IOException ex) {
                }
            }
        }).start();

        System.err.println("running ...");
        p.waitFor();

        System.err.println(list);

    }

【问题讨论】:

  • 在您的测试读取条件中,不提供读取使用 > 0

标签: java shell process


【解决方案1】:

您的输出流需要先关闭,然后输入流上才会有数据。关闭输出流向进程确认不会有进一步的输入。只有这样,它才会开始处理并输出到您的输入流。

尝试在调用“flush”之后在您的第一个线程中添加以下代码:

out.close();

【讨论】:

    猜你喜欢
    • 2016-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-29
    • 2019-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多