2

まず、apache commons exec に関する他のすべてのスレッドを読みました。端末ベースの実行可能ファイルがあります。実行すると、コマンドラインからの入力を求めるプロンプトが表示されます。Java プログラム内からこのプログラムを実行し、いくつかのコマンドをプログラムに供給する必要があります。私はapache commons execを使用しています。これは私がこれまでに持っているものです:

CommandLine command = new CommandLine("myExec");
DefaultExecuteResultHandler resultHandler = new DefaultExecuteResultHandler();
DefaultExecutor executor = new DefaultExecutor();
ShutdownHookProcessDestroyer processDestroyer = new ShutdownHookProcessDestroyer();
TextareaOutputStream outputstream = new TextareaOutputStream(jTextArea1); //this redirects the output to a text area by extending and overriding outputstream. Works perfect.
PumpStreamHandler streamHandler = new PumpStreamHandler(outputstream, outputstream);
executor.setStreamHandler(streamHandler);
OutputStream out = new ByteArrayOutputStream();
executor.getStreamHandler().setProcessInputStream(out);
executor.setProcessDestroyer(processDestroyer);
executor.execute(command, resultHandler);
out.write("myFile.dat\n".getBytes());

これはうまくいきません。私のプログラムが起動するとすぐにクラッシュします:

forrtl: severe (24): end-of-file during read, unit 5, file stdin

ここのように pipedinputstream も試しました-> Apache Commons Execを使用してコマンドに複数の入力を提供し、出力を抽出する際のトラブル:

CommandLine command = new CommandLine("myExec");
DefaultExecuteResultHandler resultHandler = new DefaultExecuteResultHandler();
DefaultExecutor executor = new DefaultExecutor();
ShutdownHookProcessDestroyer processDestroyer = new ShutdownHookProcessDestroyer();
TextareaOutputStream outputstream = new TextareaOutputStream(jTextArea1); //this redirects the output to a text area by extending and overriding outputstream. Works perfect.
PipedInputStream stdin = new PipedInputStream();
BufferedOutputStream processInput = new BufferedOutputStream(new PipedOutputStream(stdin));
PumpStreamHandler streamHandler = new PumpStreamHandler(outputstream, outputstream, stdin);
executor.setStreamHandler(streamHandler);
executor.setProcessDestroyer(processDestroyer);
executor.execute(command, resultHandler);
processInput.write("myFile.dat\n".getBytes());
processInput.flush();

これ一つで、最初のプロンプトにぶら下がります!あたかも flush() が効果がないかのように。端末プログラムは何も取得しません。

私もこのアイデアを試しました:Apache Commons Execで起動された実行可能ファイルに文字列引数をパイプする方法は?

exec を起動する前に ByteArrayInputStream にすべてを書き込むと、動作します。exec を起動してから何かを書き込もうとすると、最初のエラーが再び発生します。

どんな助けでも本当に感謝します。

完全を期すために(私はこれを書いていません。インターネットからどこから入手したか覚えていません)。これは、出力を jTextArea にリダイレクトするためのものです。

import java.io.BufferedOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;

class TextareaOutputStream extends OutputStream {

private final JTextArea area;
private final StringBuffer buf = new StringBuffer(128);


public TextareaOutputStream(final JTextArea area) throws IOException {
    this.area = area;
}

@Override
public void write(int c) throws IOException {
    // append character to buffer
    buf.append((char) c);
    // and newline appends to textarea
    if (c == '\n' || c == ':') {
        flush();
    }
}

@Override
public void close() {
    flush();
}

@Override
public void flush() {
    SwingUtilities.invokeLater(new Runnable() {

        String str = buf.toString();

        @Override
        public void run() {
            area.append(str);
        }
    });
    buf.setLength(0);
}

public void message(String msg) {
    if (buf.charAt(buf.length() - 1) != '\n') {
        buf.append('\n');
    }
    buf.append(msg);
    buf.append('\n');
    flush();
}

}

4

0 に答える 0