【问题标题】:Execute a shell command using processBuilder and interact with it使用 processBuilder 执行 shell 命令并与之交互
【发布时间】:2014-02-10 18:43:59
【问题描述】:

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

例如我想做:omxplayer -win x1 y1 x2 y2 然后可以按“p”暂停视频/音频媒体

我已经有一些可以使用参数启动 omxplayer 的东西(实际上它是“ls”,但它应该以完全相同的方式工作)但是我不明白一旦我通过启动命令后如何与终端交互进程构建器。

这是我目前所拥有的:

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){}
        }
    }
}

【问题讨论】:

标签: java shell process command processbuilder


【解决方案1】:

"(实际上是 "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.:请记住,这个例子很快就很脏。

【讨论】:

  • 感谢您的帮助!这确实帮助我们使用流程构建器:)
猜你喜欢
  • 1970-01-01
  • 2017-05-27
  • 2016-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-08
  • 2015-12-26
相关资源
最近更新 更多