Java执行外部命令行程序,获取命令行输出
天蓬老师
天蓬老师 2017-04-18 10:00:01
[Java讨论组]

一般来说,使用Runtime.getRuntime().exec 来执行一个外部的exe程序,通过proc.getErrorStream()和proc.getInputStream()就可以获得该程序的输出,大多数程序都可以成功获得输出。

但是,这次遇到的例子比较特殊,手动在命令行里执行caption2ass会得到以下内容:

我尝试用getErrorStream()或getInputStream()获得caption2ass.exe在命令行中的输出,却无法得到命令行中的内容。

主程序:

Runtime run = Runtime.getRuntime();
Process proc = run.exec("caption2ass.exe");
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);
    }
}

}
caption2ass下载地址 http://pan.baidu.com/s/1nuCClXR 欢迎测试

天蓬老师
天蓬老师

欢迎选择我的课程,让我们一起见证您的进步~~

全部回复(1)
ringa_lee

会有这样的程序,这种程序并没有使用标准输出或者错误输出,而是用了更底层的API显示内容。这种程序一般用>符号重定向输出到文件的话得到的是空的内容。这是没有什么好办法的。就像你没法将vim的界面重定向成字符串一样,因为那是在终端控制序列直接绘制的。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号