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

2023-11-27

我正在尝试创建一个程序,允许我通过带有参数的终端(如果您想知道,则为树莓派的 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(使用前将#替换为@)

使用 processBuilder 执行 shell 命令并与其交互 的相关文章

随机推荐

  • 如何在AS3中播放库中的声音?

    在Flash 10 AS3中 我添加了一些声音 它似乎工作正常 但我认为我做错了 我将声音导入到库中 但我相信它会从包含 swf sound 的文件夹中重新加载它 我像这样加载它们 var request1 URLRequest new U
  • 检测来电的目标电话号码[重复]

    这个问题在这里已经有答案了 我有一部带有 2 张 SIM 卡的 Android 手机 我想检测来电的目标 是 SIM 1 还是 SIM 2 是否可以从通话信息中获取目标号码 您的问题在文档中没有答案 但我发现了一些可以帮助你的链接 检查双卡
  • 导入错误:没有名为 django 的模块

    我在 mac 的 2 5 2 版本旁边安装了 python 2 6 我一这样做 python2 6 manage py runserver就失败了 因为它找不到django core management 从 shell 中 import
  • 解耦 Microsoft.AspNet.Identity.*

    我正在 Visual Studio 2013 RC 中工作 并使用新的测试表单身份验证Microsoft AspNet Identity 包 我想集成这些概念 用户 角色等 但想使用我自己的域模型 POCO 它们位于不同的程序集中 我也不想
  • 将项目添加到 ListView 时触发事件?

    我有这个 XAML
  • MySQL 触发器可以模拟 CHECK 约束吗? [复制]

    这个问题在这里已经有答案了 我想在MySQL中使用CHECK约束 但不支持 与其他 RDBMS 不同 它会理解但不会强制检查 我见过一些带有触发器的解决方法 但他们倾向于为相关字段设置默认值 而不是返回错误 是否可以构造一个触发器 在不满足
  • 尽管通过 FBSDKLoginButton 登录,ios Facebook SDK v4.x 访问令牌仍为空

    尽管按钮显示我已登录 但我的 Facebook 访问令牌为空 有人知道为什么会这样吗 来自 RootViewController m void viewDidLoad super viewDidLoad self gt login butt
  • 浏览器显示比原始尺寸更大的图像

    我的网站显示的图像大于其原始尺寸 这些图像比用 Photoshop 创建的原始图像大 20 例如 如果图像的宽度为 200 像素 则浏览器显示为 240 像素 所以我所有的图像都变得模糊了 你知道为什么吗 我找到了解决方案 Windows
  • sql搜索查询多个可选参数

    我正在尝试为我的文档归档系统上的高级搜索页面编写查询 我正在尝试通过多个可选参数进行搜索 我有大约 5 个参数 它们可以是空字符串或搜索字符串 我知道我不必将每个检查为字符串或空 并为每个组合创建单独的存储过程 编辑 最终使用 ISNULL
  • 强制在 C# 中实现通用接口

    无论如何 是否有强制通用定义的约束来实现 通用接口 也就是说 我希望该类支持传递接口和约束它的通用类 以便该类实现该接口 例如 如果我说 MyGenericClass
  • PHP限制文本字符串不包括html标签?

    这是对我不起作用的 我想将可见文本限制为 100 个字符 但使用substr 还包括限制中的不可见文本 a href http www a
  • Neo4j 中的基元计数

    我一直在阅读文档 for neo4j这是成分并且还没有遇到让我查询图中基元 节点 关系和属性 总数的功能 这个功能是否存在于某处 或者我是否必须编写遍历整个图表并进行计数的代码 谢谢你的提问 我是 Neo4j 团队的成员 我们目前拥有报告此
  • Spring Security在发送授权标头时允许所有拒绝访问

    我的安全配置如下 http authorizeRequests antMatchers authenticate fullyAuthenticated anyRequest permitAll and httpBasic 它可以工作并且所有
  • Rails:.m4v 文件的 MIME 类型问题

    在我的 Rails 应用程序中 我尝试获取文件的 MIME 类型 如下所示 MIME Types type for example m4v to s 但它不认识它 我尝试添加以下内容config initializers mime type
  • PyQt 4.7 - 在 Windows 上安装后出现导入错误

    我一直在尝试安装PyQt 4 7在 Vista 上 但当我尝试执行以下操作时遇到导入错误 from PyQt4 import QtCore QtGui ImportError DLL 加载失败 找不到指定的模块 我检查了我的系统路径 并且C
  • “实例 <服务器位于 0x2298c...> 未持久化”

    全新安装 postgreSQL15 后 看起来好像安装正确 因为我可以通过 psql 很好地访问服务器 但是 当我尝试通过 pgAdmin4 访问它时 它不会自动检测服务器 因此 我尝试通过 注册 服务器 对话框手动添加服务器 但随后提示我
  • 32 位处理器真的可以寻址 2^32 个内存位置吗?

    我觉得这可能是一个奇怪 愚蠢的问题 但这里是 在问题中C 中的 NULL 是否需要 定义为零 已经确定NULL指针指向不可寻址的内存位置 而且NULL is 0 现在 据说 32 位处理器可以寻址2 32记忆位置 2 32只是可以使用以下方
  • Java keyTool - 将主要/辅助中间证书附加到密钥存储[关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 我已经创建了一个密钥库 图中的 server jks 并导入了相关密钥对 keytool importkeystore srckeystore server p12 destkeys
  • 使用数据映射器模式,实体(域对象)是否应该了解映射器?

    我是第一次使用 Doctrine2 但我认为这个问题足够通用 不依赖于特定的 ORM 数据映射器模式中的实体是否应该意识到 以及use 地图绘制者 我有一些具体的例子 但它们似乎都可以归结为同一个普遍问题 如果我正在处理来自外部源的数据 例
  • 使用 processBuilder 执行 shell 命令并与其交互

    我正在尝试创建一个程序 允许我通过带有参数的终端 如果您想知道 则为树莓派的 OmxPlayer 执行命令 但我希望在启动后能够与它进行交互命令 例如我想做 omxplayer win x1 y1 x2 y2 然后可以按 p 暂停视频 音频