我正在尝试创建一个程序,允许我通过带有参数的终端(如果您想知道,则为树莓派的 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 对象的 OutputStream (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();
}
}
}
P.S.:请记住,这个例子既快速又肮脏。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)