2

このコマンドを実行したい:

/ceplinux_work3/myName/opt/myCompany/ourProduct/bin/EXECUTE_THIS -p cepamd64linux.myCompany.com:19021/ws1/project_name < /ceplinux_work3/myName/stressting/Publisher/uploadable/00000.bin >> /ceplinux_work3/myName/stressting/Publisher/stats/ws1.project_name.19021/2011-07-22T12-45-20_PID-2237/out.up

しかし、EXECUTE_THIS はリダイレクト経由で入力ファイルを必要とし、このコマンドを単に Runtime.exec に渡すだけでは機能しないため、機能しません。

サイドノート:ここに質問する前に、これを解決する方法をすべて検索しました。Web には、Runtime.exec および入出力リダイレクトに関する多くの質問/記事があります。ただし、ファイルをコマンドに渡し、結果を別のファイルに出力することを扱うものは見つかりません。さらに、私は入力/出力ストリームにまったく慣れていないため、特定の状況に合わせてすべての情報をまとめるのに苦労しています。

とはいえ、どんな助けも大歓迎です。

PSこれを行う方法が複数ある場合、スループットの点で最速のものを優先します。

編集: 最後の質問で説明したように、プログラムはこのプロセスが完了するまで待ってから続行する必要があるため、これを bash 呼び出しに変更することはできません。

4

1 に答える 1

2

プロセスの標準入力にファイル名を送信しない限り、データがファイルからのものか、他のデータソースからのものかは区別されません。

OutputStreamあなたはによって与えられたに書く必要がありますProcess.getOutputStream()書き込んだデータは、を使用してファイルから読み込むことができますFileInputStream

それをまとめると、次のようになります。

    Process proc = Runtime.getRuntime().exec("...");

    OutputStream standardInputOfChildProcess = proc.getOutputStream();
    InputStream dataFromFile = new FileInputStream("theFileWithTheData.dat");

    byte[] buff = new byte[1024];
    for ( int count = -1; (count = dataFromFile.read(buff)) != -1; ) {
        standardInputOfChildProcess.write(buff, 0, count);
    }

私は多くの詳細を省略しました、これはそれの要点を理解するためだけです。安全に物事を閉じたいと思うでしょう、バッファリングを検討したいと思うかもしれません、そしてあなたはの落とし穴Runtime.exec()について心配する必要があります。

編集

出力をファイルに書き込むのも同様です。FileOutputStream出力ファイルへのポインティングを取得し、そこProcess.getInputStream()から読み取ったデータをそこに書き込みますOutputStream。ここでの主な注意点は、同じスレッドから2つのブロッキングストリームにアクセスするとデッドロックが発生するため、2番目のスレッドでこの操作を実行する必要があることです(上記の記事を参照)。

于 2011-07-22T20:58:40.690 に答える