在windows中,使用Java,我们主要可以调用Runtime.getRuntime().exec
来执行可执行应用程序或批处理文件,然后调用proc.getErrorStream()
proc.getInputStream()
来获取标准输出/错误流。
但是在这个时候,我有一个名为'caption2ass.exe'的应用程序(caption2ass.exe是一个知道很受欢迎的工具,它可以从传输流中提取ass字幕),它打印了很多信息进入屏幕,但似乎Java程序 CAN NOT 通过调用proc.getErrorStream()
或proc.getInputStream()
来接收信息。
手动我在命令行中输入'caption2ass.exe',然后按[enter]。之后,屏幕将显示:
我正在尝试接收屏幕上的信息并将其放入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
之前只得到一个奇怪的字符:
所以,我的问题是:如何使用java在'caption2ass.exe'的屏幕上获取输出信息?
你可以从这里获得caption2ass:http://pan.baidu.com/s/1nuCClXR
,如果您不敢运行未知程序,尤其是来自百度,您可以在沙箱中运行此程序。
欢迎任何测试。
答案 0 :(得分:0)
谢谢各位的回复。
我找到了caption2ass的源代码,它是一个c ++程序。
我已经更改了每个日志记录,让他们将信息记录到stdout中,然后重新编译它。
所以我现在可以使用proc.getInputStream()
轻松地在java程序中接收caption2ass的输出。