我有一个字符串需要通过管道传输到外部程序,然后读回输出。我知道如何读回输出,但如何将此字符串作为输入进行管道传输?谢谢!
最佳答案
注意不要造成死锁。如果进程正在写入您未读取的数据,而同时您正在写入它未读取的数据,则在同一线程中读取/写入进程可能会出现问题。
我倾向于使用一个小的模式行来让 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/