2016-08-08 15 views
0

Javaでexe用のGUIを作成しています。少し面倒ですが、私は挑戦しています。このプログラムはコンソールプログラムであるため、実行中のプログラムの出力を読み込んで、それをSwingのテキストボックスに入れる必要があります。しかし、私が試したあらゆる方法は不安定であるか、まったく動作しません。誰もがこれで私を助けることができますか?注意私はApache Commons execを試してみましたが、ほとんど成功しませんでした。また、私はこのクロスプラットフォームを作るしようとしているとOSを取得するためのメソッドを作成しました:Java - プログラムの実行中にexecとreadの出力を使用する

public enum OSType { 
    WINDOWS, OSX, LINUX, DAFUQ 
} 

/** 
* Gets OS running on then caches result 
* @return OS running on 
**/ 
public static OSType getOS() { 
    if (os != null) 
     return os; 
    else { 
     os = getOperatingSystem(); 
     return os; 
    } 
} 

/** Don't use this! Use {@link Frame#getOS()} instead **/ 
public static OSType getOperatingSystem() { 
    String OS = System.getProperty("os.name").toLowerCase(); 
    if (OS.indexOf("win") >= 0) 
     return OSType.WINDOWS; 
    else if (OS.indexOf("mac") >= 0) 
     return OSType.OSX; 
    else if (OS.indexOf("nix") >= 0 || OS.indexOf("nux") >= 0 || OS.indexOf("aix") > 0) 
     return OSType.LINUX; 
    else 
     return OSType.DAFUQ; 
} 

EDIT:

を明確にするために、私はとして機能の.jarプログラムを作成していますEXEのGUIです。これは私が現在、プログラムを起動するために使用しようとしていますコードです:

ProcessBuilder prc = new ProcessBuilder(commands); 

     prc.redirectErrorStream(true); 

     try { 
      Frame.exec = prc.start(); 
     } catch (IOException e1) { 
      // TODO Auto-generated catch block 
      e1.printStackTrace(); 
     } 

commands変数は、私が実行する必要があるコマンドのリストだけです。プログラムが正しく動作しているのは、タスクマネージャー上で動作しているのが分かるからです。ここで私は、プロセスの入力ストリームから読んでいますかのコードでもある:

BufferedReader in = new BufferedReader(new InputStreamReader(exec.getInputStream())); 
     String line; 
     while ((line = in.readLine()) != null) { 
      System.out.println(line); 
     } 

私は非同期ストリームから読み取るしようとしていますので、このコードは、私が格納するために必要な理由は別のスレッドであります"exec"変数。

+0

あなたは本当に言っていますか?**あなたはバイナリEXEとしてデプロイしたいと思う** javaアプリケーションを書いていますか?あなたのJavaコードはsystem.outに書き込んでいます。今、あなたは何をしたいですか?その出力をフェッチしてUI要素に入れますか? – GhostCat

+0

これには標準的なパターンがあり、SOにはいくつかのダンプがありますが、今のところ見つけられないようです。基本的な要件は、プロセスの '' stdin'への入力を供給する1つのスレッド、プロセスの '' stdout/stderr'の出力を読み込む1つのスレッド、およびプロセスが終了した後のメインスレッドをクリーンアップすることです。 Excessal実行可能ファイルを起動するには、 'ProcessBuilder'を使います。ところで、実際にプロセスを起動するコードはどこですか? –

+0

http://stackoverflow.com/questions/8149828/read-the-output-from-java-exec?rq=1? –

答えて

0

私はProcessBuilderから取得しようとしましたが、コンソール出力を読み取る前にプログラムが終了するまで待ちます。

いいえ。それは書かれてすぐに書かれたものを読みます。あなたが見ているのは、おそらくstdioで、子プロセスの出力をバッファリングする効果です。そのプロセスのコードを管理していない場合は、そのプロセスについて何もできません。

+0

ソースにアクセスできます。私はそれが動作するようにそれを変更することができますか? –

+0

@DanielPickeringこれはあなたが探しているものですか? (基本的な実行可能ファイルがC言語で書かれていると仮定します):https://stackoverflow.com/q/259355 – Siguza

+0

@Siguza私は開発環境をセットアップしますが、動作するかもしれません。リンクありがとう。 –