首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Eclipse中运行外部程序

在Eclipse中运行外部程序
EN

Stack Overflow用户
提问于 2014-08-12 22:46:49
回答 1查看 945关注 0票数 2

我可以通过下面的代码在Eclipse中打印外部程序的输出(可以在网上找到,不是我的)。我希望能够将命令传递给程序,然后打印程序的输出,但我不知道如何将命令传递给程序。如有任何建议,将不胜感激,谢谢!

代码:

代码语言:javascript
复制
String line;
Process p = Runtime.getRuntime().exec("Z:/LPCXpresso/test10/Debug/arm-none-eabi-readelf.exe");
BufferedReader bri = new BufferedReader(new InputStreamReader(p.getInputStream()));
BufferedReader bre = new BufferedReader(new InputStreamReader(p.getErrorStream()));
while ((line = bri.readLine()) != null) {
     System.out.println(line);
}
bri.close();
while ((line = bre.readLine()) != null) {
     System.out.println(line);
}
bre.close();
p.waitFor();
EN

回答 1

Stack Overflow用户

发布于 2014-08-13 05:37:45

首先,我建议使用ProcessBuilder而不是Runtime.getRuntime().exec(...)

其次,为了能够与启动的进程的不同流进行交互,您需要并发地执行此操作,即为每个流创建一个自己的线程,您可以在其中与其进行交互。

下面是一个示例代码,它演示了与windows cmd.exe中命令行提示符的交互

代码语言:javascript
复制
public static void main(String... args) throws Exception {

    ProcessBuilder pb = new ProcessBuilder("cmd.exe");
    Process proc = pb.start();

    // handle each of proc's streams in a separate thread
    ExecutorService handlerThreadPool = Executors.newFixedThreadPool(3);


    handlerThreadPool.submit(new Runnable() {
        @Override
        public void run() {
            // we want to write to the stdin of the process
            BufferedWriter stdin = new BufferedWriter(
                new OutputStreamWriter(proc.getOutputStream()));

            // read from our own stdin so we can write it to proc's stdin
            BufferedReader myStdin = 
            new BufferedReader(new InputStreamReader(System.in));
            String line = null;
            try {
                do {
                    line = myStdin.readLine();
                    stdin.write(String.format("%s%n", line));
                    stdin.flush();
                } while(! "exit".equalsIgnoreCase(line));
            } catch(IOException e) {
                e.printStackTrace();
            }
        }
    });



    handlerThreadPool.submit(new Runnable() {
        @Override
        public void run() {
            // we want to read the stdout of the process
            BufferedReader stdout = new BufferedReader(
                new InputStreamReader(proc.getInputStream()));
            String line;
            try {
                while(null != (line = stdout.readLine())) {
                    System.out.printf("[stdout] %s%n", line);
                }
            } catch(IOException e) {
                e.printStackTrace();
            }
        }
    });

    handlerThreadPool.submit(new Runnable() {
        @Override
        public void run() {
            // we want to read the stderr of the process
            BufferedReader stderr = new BufferedReader(
                new InputStreamReader(proc.getErrorStream()));
            String line;
            try {
                while(null != (line = stderr.readLine())) {
                    System.err.printf("[stderr] %s%n", line);
                }
            } catch(IOException e) {
                e.printStackTrace();
            }
        }
    });

    // wait for the process to terminate
    int exitCode = proc.waitFor();
    System.out.printf("Process terminated with exit code %d%n", exitCode);
    handlerThreadPool.shutdown();
}

您可以在启动进程之前使用ProcessBuilder#redirectErrorStream(true)将进程stderr重定向到stdout,这样就只有两个线程,一个用于输入,一个用于输出

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25267344

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档