我正在尝试创建一个程序,允许我通过带有参数的终端(如果您想知道,它是用于树莓派的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:请记住,此示例很快就太脏了。
I使用Processbuilder如下所示: 在方法中,我设置要执行的linux命令,如下所示: 我可以从终端执行相同的命令。
我试图使用Java的类来执行包含管道的命令。例如: 然而,我得到了一个错误: 然后: 尽管该命令在命令行中运行得很好,但我无法让执行将其输出重定向到另一个的命令。 有没有办法做到这一点?
堆栈跟踪: cat://opt/mapr/zookeeper/zookeeeperversion:没有这样的文件或目录16/10/25 07:41:12信息Sqoop.Sqoop:运行Sqoop版本:1.4.6-mapr-1609 16/10/25 07:41:12警告工具。basesqooptool:在命令行设置密码不安全。考虑改用-p。16/10/25 07:41:13错误tool.bases
问题内容: 我仍在尝试掌握如何运行linux或Windows shell命令并在node.js中捕获输出的细节。最终,我想做这样的事情… 重要的一点是必须对全局范围的变量(或对象)可用。我尝试了以下功能,但是由于某种原因,我被打印到控制台了。 我很难理解代码在哪里突破了…该模型的非常简单的原型可以工作… 有人可以帮助我了解为什么有效,但是无效吗?FWIW,我需要使用,因为缓冲区限制为200KB。
我有一个案例,我想问我可以解决与Spring壳。我有一个Main.jar应用程序,它有几个部署在Wildly服务器上的Spring任务。在我的例子中,我不能停止或重新部署main.jar,因为必须不停地提供服务。