小编典典
“(实际上是“ ls”,但它应该以完全相同的方式工作)”
不它不是。因为“ ls”过程在调用后立即返回。另一方面,您的omixplayer是交互式的,将在运行时接受命令。
您要做的是:
创建一个实现Runnable的类,并让该类从prs.getInputStream()中读取。您将需要这样做,因为.read()将阻塞并等待读取新数据。
获取Process对象的输出流(prs.getOutputStream())。您写入OutputStream的所有内容都将从您的omixplayer中读取。不要忘记刷新OutputStream,每个命令的末尾都需要一个“ \ n”来执行。
像那样:
public class TestMain {
public static void main(String a[]) throws InterruptedException {
List commands = new ArrayList();
commands.add("telnet");
commands.add("www.google.com");
commands.add("80");
ProcessBuilder pb = new ProcessBuilder(commands);
pb.redirectErrorStream(true);
try {
Process prs = pb.start();
Thread inThread = new Thread(new In(prs.getInputStream()));
inThread.start();
Thread.sleep(2000);
OutputStream writeTo = prs.getOutputStream();
writeTo.write("oops\n".getBytes());
writeTo.flush();
writeTo.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
class In implements Runnable {
private InputStream is;
public In(InputStream is) {
this.is = is;
}
@Override
public void run() {
byte[] b = new byte[1024];
int size = 0;
try {
while ((size = is.read(b)) != -1) {
System.err.println(new String(b));
}
is.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
PS:请记住,此示例很快就太脏了。
2020-11-16