在Java中,执行其他应用程序并接收屏幕输出

时间:2016-09-19 11:56:51

标签: java windows winapi console

在windows中,使用Java,我们主要可以调用Runtime.getRuntime().exec来执行可执行应用程序或批处理文件,然后调用proc.getErrorStream() proc.getInputStream()来获取标准输出/错误流。

但是在这个时候,我有一个名为'caption2ass.exe'的应用程序(caption2ass.exe是一个知道很受欢迎的工具,它可以从传输流中提取ass字幕),它打印了很多信息进入屏幕,但似乎Java程序 CAN NOT 通过调用proc.getErrorStream()proc.getInputStream()来接收信息。

手动我在命令行中输入'caption2ass.exe',然后按[enter]。之后,屏幕将显示:

manually I entered caption2ass.exe in the cmd

我正在尝试接收屏幕上的信息并将其放入sysout,或将来将其放入字符串数组中。

我的Java代码如下:

主程序:

    String cmd = "E:\\program_media\\Mikey's Fansub Utilities\\TS-OneKeyProcess\\tools\\caption2ass-pcr\\Caption2Ass_PCR.exe";
    Runtime run = Runtime.getRuntime();
    Process proc = run.exec(cmd);
    StreamGobbler errorGobbler = new StreamGobbler(
        proc.getErrorStream(), "GBK", "ERR", System.err);
    StreamGobbler outputGobbler = new StreamGobbler(
        proc.getInputStream(), "GBK", "OUT", System.out);
    errorGobbler.start();
    outputGobbler.start();
    int exitVal = proc.waitFor();
    System.out.println("ExitValue: " + exitVal);

StreamGobbler.java:

public class StreamGobbler extends Thread {
    InputStream in;
    String charsetName;
    String type;
    PrintStream out;
    StreamGobbler(InputStream inputStream, String charsetName, String type, PrintStream out) {
        this.in = inputStream;
        this.charsetName = charsetName;
        this.type = type;
        this.out = out;
    }
    @Override
    public void run() {
        try {
            InputStreamReader isr = new InputStreamReader(in, charsetName);
            char[] cbuf = new char[256];
            int len = -1;
            while ( -1 != (len=isr.read(cbuf))){
                out.print(Arrays.copyOf(cbuf, len));
            }
        } catch (IOException ioe) {
            ioe.printStackTrace();
        } finally {
            IOUtils.closeQuietly(in);
        }
    }
}

运行这个java程序之后,我在ExitValue之前只得到一个奇怪的字符: After running this java program, I only got a strange character

所以,我的问题是:如何使用java在'caption2ass.exe'的屏幕上获取输出信息?

你可以从这里获得caption2ass:http://pan.baidu.com/s/1nuCClXR ,如果您不敢运行未知程序,尤其是来自百度,您可以在沙箱中运行此程序。

欢迎任何测试。

1 个答案:

答案 0 :(得分:0)

谢谢各位的回复。

我找到了caption2ass的源代码,它是一个c ++程序。

我已经更改了每个日志记录,让他们将信息记录到stdout中,然后重新编译它。

所以我现在可以使用proc.getInputStream()轻松地在java程序中接收caption2ass的输出。