1

私はJavaコンパイラとjvmをその中から直接実行できるプログラムを作成しています(なぜ私が車輪の再発明をしているのか私に聞かないでください、あなたの返事が役に立たないなら、それを保存してください、私はすでにかなりイライラしています動作しないソリューションの時間!)。これまでのところ、javaで始まるtextFieldに何かを入力するたびに追跡するように管理して、実際にテキストをラップして次のように実行できるようにしました。

    if(String.valueOf(object).startsWith("java")){
        try{
            Runtime runtime = Runtime.getRuntime();
            Process process = runtime.exec(String.valueOf(object));
        }
        catch(Exception e){gsc.mainWindow.printf("error");}

gsc.mainWindow.printf(...);JFrame内のJTextAreaへの出力について考えてみます。

私が今管理しているのはコマンドを実行することですが、失敗した場合は出力に直接印刷できます。私はこれが何回も前に答えられたことを知っています、これをするための約10の方法を読んでください、しかしそれらのどれも私がそれを実行することができる点までうまくいかなかったか理解できませんでした。プロセスがデフォルトのシステムのコンソール(cmd、terminal)に書き込んでいるものを出力してから停止する必要があるため、コードは十分に単純である必要があります(これはすべてメソッド呼び出しである可能性があると思いました)。私はこの種のものにかなり苦手です。マルチスレッドソリューションでさえ私のニーズに合う可能性があります。専門的すぎるものは何もありません。機能するために必要なだけです。あなたが必要とするどんな情報でも、遠ざけてください!前もって感謝します!:)

4

1 に答える 1

4

これを読みたいかどうかはわかりませんが、Javaの世界では、独自のソリューションを実装する前に、常に解決策を探す必要があります。そして、一般的な問題の解決策は、ほとんどの場合、ApacheCommonsまたは他のApacheプロジェクトから得られます。ソリューション以外のすべてが機能しない、または複雑すぎると言うと、時間とお金(そして最終的には仕事)がかかるだけです。

Apache Commons Execは、問題をより速く、より簡単に解決するために必要なものです。

- - 編集 - -

子プロセスの出力をキャプチャする方法のコードを次に示します。それだけのクラス、PumpStreamHandlerがあります:

DefaultExecutor exec = new DefaultExecutor();
PumpStreamHandler streamHandler = new PumpStreamHandler();
exec.setStreamHandler(streamHandler);

CommandLine commandline = CommandLine.parse(command);  //where command is your command line
exec.execute(commandline);

----編集2----

:を使用してメッセージをキャプチャするコピーアンドペーストソリューションは次のOutputStreamとおりです。

public abstract class LogOutputStream extends OutputStream {

protected static final String LINE_SEPERATOR = System.getProperty("line.separator");
public static final int DEFAULT_BUFFER_LENGTH = 2048;

protected boolean hasBeenClosed = false;
protected byte[] buf;
protected int count;
private int bufLength;

public LogOutputStream() {
    bufLength = DEFAULT_BUFFER_LENGTH;
    buf = new byte[DEFAULT_BUFFER_LENGTH];
    count = 0;
}

public void close() {
    flush();
    hasBeenClosed = true;
}

public void write(final int b) throws IOException {
    if (hasBeenClosed) {
        throw new IOException("The stream has been closed.");
    }
    if (b == 0) {
        return;
    }
    if (count == bufLength) {
        final int newBufLength = bufLength + DEFAULT_BUFFER_LENGTH;
        final byte[] newBuf = new byte[newBufLength];

        System.arraycopy(buf, 0, newBuf, 0, bufLength);

        buf = newBuf;
        bufLength = newBufLength;
    }
    buf[count] = (byte) b;
    count++;
}

public void flush() {
    if (count == 0) {
        return;
    }
    if (count == LINE_SEPERATOR.length()) {
        if (((char) buf[0]) == LINE_SEPERATOR.charAt(0)
                && ((count == 1) ||
                ((count == 2) && ((char) buf[1]) == LINE_SEPERATOR.charAt(1)))) {
            reset();
            return;
        }
    }
    final byte[] theBytes = new byte[count];
    System.arraycopy(buf, 0, theBytes, 0, count);
    log(new String(theBytes));
    reset();
}


private void reset() {
    count = 0;
}

public abstract void log(String message);
}

次に、そのサブクラスを作成しpublic void log(String message)、UIを更新するコードを使用してを実装すると、完了です。

于 2012-09-14T15:54:33.300 に答える