我需要做的是进入应用程序的交互模式,然后开始向它发送命令。该应用程序是graphicsmagick。批处理模式使您处于类似于mysql工作方式的状态,然后您可以在该状态下发送命令,而不使用命令前缀的应用程序名称。这就是我所做的:
public Executor startBatchMode( OutputStream input ) {
Executor executor = new DefaultExecutor();
CommandLine cmdLine = new CommandLine( cmdPath );
cmdLine.addArgument( "batch" );
DefaultExecuteResultHandler resultHandler = new DefaultExecuteResultHandler();
// AutoFlushingPumpStreamHandler: https://gist.github.com/martypitt/4653381
// AutoFlushingPumpStreamHandler streamHandler = new AutoFlushingPumpStreamHandler( System.out );
PumpStreamHandler streamHandler = new PumpStreamHandler( System.out );
streamHandler.setProcessInputStream(input );
executor.setStreamHandler( streamHandler );
try {
executor.execute( cmdLine, resultHandler );
streamHandler.start();
} catch ( IOException e ) {
e.printStackTrace();
}
return executor;
}
public static void main( String[] args ) throws IOException {
ExecWrapper exec = new ExecWrapper( "/usr/local/bin/gm" );
OutputStream stream = new PipedOutputStream( );
PrintWriter writer = new PrintWriter(stream);
Executor executor = exec.startBatchMode( stream );
for(int i=0;i<5;i++) {
writer.write( "convert /Users/latu/Desktop/400.jpg /Users/latu/Desktop/"+i+".png\n" );
writer.flush();
}
writer.close();
对于输出,应用程序进入批处理模式,然后终止。从终端使用时,它将进入批处理模式,然后等待用户的命令,直到EOF字符。我在调用startBatchMode()之前尝试向编写器添加命令,但没有区别。还尝试了相当多的东西,但结果总是一样的。
关于如何使这项工作的任何建议?
更新
事实证明,使用Java运行时这是非常简单的,并且工作方式如下:
private void runExec() throws IOException {
Process process = Runtime.getRuntime().exec( "/usr/local/bin/gm batch" );
OutputStream stdin = process.getOutputStream();
for ( int i = 0; i < 5; i++ ) {
String line = "convert /Users/latu/Desktop/400.jpg /Users/latu/Desktop/" + i + ".png" + "\n";
stdin.write( line.getBytes() );
stdin.flush();
}
}
虽然我希望留在exec,因为它有一些很好的功能,理想情况下我不需要重新实现。
答案 0 :(得分:0)
问题在于流。我需要创建一个PipedOutputStream并将其传递给PipedInputStream。然后将PipedInputStream传递给我的StreamHandler构造函数。之后,在PipedOutputStream上编写的任何内容都按预期执行。