Java 在交互命令模式下使用apacheexec

Java 在交互命令模式下使用apacheexec,java,terminal,apache-commons-exec,Java,Terminal,Apache Commons Exec,我需要做的是进入应用程序的交互模式,然后开始向它发送命令。该应用程序是graphicsmagick。批处理模式使您处于与mysql工作方式类似的状态,您可以在不使用应用程序名称作为命令前缀的情况下发送命令。以下是我所做的: public Executor startBatchMode( OutputStream input ) { Executor executor = new DefaultExecutor(); CommandLin

我需要做的是进入应用程序的交互模式,然后开始向它发送命令。该应用程序是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,因为它有一些很好的特性,理想情况下我不需要重新实现

问题出在溪流上。我需要创建一个PipedOutStream并将其传递给PipedInputStream。然后将PipedInputStream传递给我的StreamHandler构造函数。此后,在PipeDoutpStream上写入的任何内容都按预期执行