将字符串作为输入传送到Java Runtime.exec()中
我有一个字符串,我需要将其导入外部程序,然后将输出读回。我知道如何读回输出,但如何将此字符串作为输入?谢谢 它是这样的(未编译且未测试) 它是这样的(未编译和未测试)将字符串作为输入传送到Java Runtime.exec()中,java,runtime.exec,Java,Runtime.exec,我有一个字符串,我需要将其导入外部程序,然后将输出读回。我知道如何读回输出,但如何将此字符串作为输入?谢谢 它是这样的(未编译且未测试) 它是这样的(未编译和未测试) 小心不要造成死锁。如果进程正在写入您未读取的数据,而您正在写入它未读取的数据,则在同一线程中读取/写入进程可能会出现问题 我倾向于使用一个小的模式线来让io在不同的线程中运行: import java.io.InputStream; import java.io.OutputStream; public final class
小心不要造成死锁。如果进程正在写入您未读取的数据,而您正在写入它未读取的数据,则在同一线程中读取/写入进程可能会出现问题 我倾向于使用一个小的模式线来让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();
}
}
}
这可能适用于您想要做的事情,也可能不适用于您想要做的事情——可能您正在处理一组已建立的输入,这些输入保证在某些预期输出之后出现(反之亦然,或者多次迭代)。即一些同步块和步进式交互
但如果你只是在“观察”可能出现的东西,那么这是朝着正确方向的良好开端。您将传入一些不同的流,并使用一些java.util.concurrent“wait(long,TimeUnit)”类型的代码来等待响应。Java IO基本上永远在read()操作上阻塞,因此如果无法从外部进程获得预期的响应,将自己与这些线程分离将允许您在一段时间后放弃。小心不要造成死锁。如果进程正在写入您未读取的数据,而您正在写入它未读取的数据,则在同一线程中读取/写入进程可能会出现问题 我倾向于使用一个小的模式线来让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();
}
}
}
这可能适用于您想要做的事情,也可能不适用于您想要做的事情——可能您正在处理一组已建立的输入,这些输入保证在某些预期输出之后出现(反之亦然,或者多次迭代)。即一些同步块和步进式交互
但如果你只是在“观察”可能出现的东西,那么这是朝着正确方向的良好开端。您将传入一些不同的流,并使用一些java.util.concurrent“wait(long,TimeUnit)”类型的代码来等待响应。Java IO基本上永远阻塞在read()操作上,因此如果无法从外部进程获得预期的响应,将自己与这些线程分离将允许您在一段时间后放弃