使用processBuilder执行shell命令并与之交互

我正在尝试创建一个程序,允许我通过带有参数的终端(如果您想知道,它是用于树莓派的OmxPlayer)来执行命令,但是我希望能够在启动后与它进行交互命令。

例如,我要执行以下操作:omxplayer -win x1 y1 x2 y2,然后可以按“ p”暂停视频/音频媒体

我已经有了一些可以用参数启动omxplayer的东西(实际上是“

ls”,但是它应该以完全相同的方式工作),但是我不了解如何通过processBuilder启动命令后如何与终端进行交互。

这是我目前所拥有的:

import java.io.ByteArrayOutputStream;

import java.io.IOException;

import java.io.InputStream;

import java.util.ArrayList;

import java.util.List;

public class Main1 {

public static void main(String a[]){

InputStream is = null;

ByteArrayOutputStream baos = null;

List<String> commands = new ArrayList<String>();

commands.add("ls");

commands.add("-l");

commands.add("/");

ProcessBuilder pb = new ProcessBuilder(commands);

try {

Process prs = pb.start();

is = prs.getInputStream();

byte[] b = new byte[1024];

int size = 0;

baos = new ByteArrayOutputStream();

while((size = is.read(b)) != -1){

baos.write(b, 0, size);

}

System.out.println(new String(baos.toByteArray()));

}

catch (IOException e)

{

e.printStackTrace();

}

finally

{

try {

if(is != null) is.close();

if(baos != null) baos.close();

} catch (Exception ex){}

}

}

}

回答:

“(实际上是“ 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<String> commands = new ArrayList<String>();

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:请记住,此示例很快就太脏了。

以上是 使用processBuilder执行shell命令并与之交互 的全部内容, 来源链接: utcz.com/qa/435859.html

回到顶部