java - 将字符串作为输入传递到 Java Runtime.exec()

标签 java runtime.exec

我有一个字符串需要通过管道传输到外部程序,然后读回输出。我知道如何读回输出,但如何将此字符串作为输入进行管道传输?谢谢!

最佳答案

注意不要造成死锁。如果进程正在写入您未读取的数据,而同时您正在写入它未读取的数据,则在同一线程中读取/写入进程可能会出现问题。

我倾向于使用一个小的模式行来让 io 在不同的线程中运行:

import java.io.InputStream;
import java.io.OutputStream;

public final class Pipe implements Runnable {

    private final InputStream in;
    private final OutputStream out;

    public Pipe(InputStream in, OutputStream out) {
        this.in = in;
        this.out = out;
    }

    public static void pipe(Process process) {
        pipe(process.getInputStream(), System.out);
        pipe(process.getErrorStream(), System.err);
        pipe(System.in, process.getOutputStream());
    }

    public static void pipe(InputStream in, OutputStream out) {
        final Thread thread = new Thread(new Pipe(in, out));
        thread.setDaemon(true);
        thread.start();
    }

    public void run() {
        try {
            int i = -1;

            byte[] buf = new byte[1024];

            while ((i = in.read(buf)) != -1) {
                out.write(buf, 0, i);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

这可能适用于也可能不适用于您想要做的事情——也许您处理的是一组已确定的输入,这些输入保证在某些预期输出之后出现(反之亦然,或多次迭代)。 IE。一些同步块(synchronized block)和步骤类型的交互。

但是,如果您只是“观察”可能出现的情况,那么这是朝着正确方向迈出的良好开端。您将传递一些不同的流并在一些 java.util.concurrent 'await(long,TimeUnit)' 类型代码中工作以等待响应。 Java IO 基本上永远阻塞在 read() 操作上,因此如果您没有从外部进程获得预期的响应,那么将您自己与这些线程分离将使您能够在一段时间后放弃。

关于java - 将字符串作为输入传递到 Java Runtime.exec(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3410869/

相关文章:

Java 谷歌网站管理员热门查询

Java:从资源文件夹内的文件夹中的txt文件读取

java - 重新定义扫描仪的非数字识别?

java - $PATH 变量不是通过 getRuntime().exec 继承的

java - 通过反射从对象的字段访问数组

Java:绑定(bind)不匹配:使用比较器时出错

Java 签名小程序无法在浏览器上运行

java - 如何使用 Java 运行时使用 "cd"命令?

java - Java 中的 Runtime.exec() 挂起,因为它正在等待来自 System.in 的输入

java - 无法使用 Runtime.getRuntime().exec(commandArray, null, directory) 从不同目录运行命令;