我正在使用ImageMagick,我想知道从ImageMagick进程的StdOut中读取图像数据的最佳方法。
我是一个调用该过程的命令,如下所示: / opt / local / bin / convert -resize 8000 @ - -
然后将一个字节数组传递给进程进行处理。
从这样的流程中读取数据的最佳方法是什么?
答案 0 :(得分:2)
您可能希望查看Apache Commons Exec这为您提供了一种运行可执行文件并将结果传递给Java的好方法。
它与使用迈克尔提到的方法类似,但应该允许您更多控制。
tutorial页面上有一些很好的使用示例。
答案 1 :(得分:2)
只想通过Apache commons exec使用ImageMagick发布代码示例以获得完整性
try {
StringBuffer sb = new StringBuffer();
sb.append(this.validPathToImageMagickCommand);
sb.append('\u0020');
for (int i = 0; i < args.size(); i++) {
String s = args.get(i);
sb.append(s);
}
CommandLine cl = CommandLine.parse(sb.toString());
PumpStreamHandler pumpStreamHandler = new PumpStreamHandler(output, System.err, new ByteArrayInputStream(inputBytes));
byAs = new ByteArrayInputStream(inputBytes);
pumpStreamHandler.setProcessOutputStream(byAs);
DefaultExecutor executor = new DefaultExecutor();
executor.setStreamHandler(pumpStreamHandler);
int exitValue = executor.execute(cl);
outputBytes = output.toByteArray();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (byAs != null)
byAs.close();
if (output != null)
output.close();
} catch (IOException e) {
System.out.println(e);
}
}
答案 2 :(得分:1)
Runtime.exec()
方法返回Process
,其中包含获取被调用进程的输入,输出和错误流的方法。
我确实想知道你是如何设法“以任何其他方式将字节数组传递给进程”。
请注意,您必须使用多个线程来处理生成进程的输入和输出,因为如果您尝试“输入”大量输入而不读取任何输出,它将会阻塞。
答案 3 :(得分:1)
如果您确实想使用Runtime.exec(),请查看this question,因为runtime.exec()可能有点棘手。
您可能希望将OUTPUT的StreamGobbler更改为将stdout存储在数组中的某些内容。并且在执行waitFor()之前启动线程,以防止,正如迈克尔所说,阻止。