0

誰かが私にアドバイスをくれることを望んでいました。私はJavaでプログラムを実行していて、すでにbashで記述されている関数を含める必要があります。正直なところ、どこから始めればいいのかわかりません。

Javaプログラムである程度処理するファイルがあります(重複を取り出したり、名前を並べ替えたりします)。他のファイルへのパスがいくつかあります。

for(String go:parsun){
    pathed="/home/S/Data/"+go+"/Ana/lysis/"+go+"/file.vcf";
    System.out.println("Pathed: " + pathed);
 }

これらのパスを使用して、ファイルの内容を取得し、内部に数学的なことを行うbashプログラムを実行する必要があります。私はインターネットの周りで、Javaでbashスクリプトを実行するために次のようなことを行うことができることを見てきました。

Process pro=Runtime.getRuntime().exec("shellfilepath");
BufferedReader read=new BufferedReader(new InputStreamReader(pro.getInputStream());

しかし、それがどのように機能するのか、またはファイルパスをどのように渡すのかがわかりません。また、もう1つの考慮事項は、bashスクリプトを少し変更して、これらのパスを使用できるようにする必要があることです。以前は、パスは事前にハードコーディングされていました。また、その面でいくつかの提案が必要になります。

これは、bashとJavaを連携させるための最良の方法ですか?別のテクニックはありますか?そうでない場合、誰かがランタイムの使用方法を理解するのを手伝ってくれるでしょうか?

ありがとう

4

4 に答える 4

2

あなたが使用することができます:

Process process = Runtime.getRuntime().exec("bash_command " + pathed);

pathedファイル名は引数として渡されます$1

于 2012-09-13T17:23:49.667 に答える
1

以下は、Javaからシェルスクリプトを実行するためのかなり良い入門書のように見えます:http: //obscuredclarity.blogspot.com/2011/07/executing-shell-script-from-java.html

Runtime.exec()引数を受け入れるようにシェルスクリプトを変更する方法と、スクリプトを呼び出して引数を渡すために使用する方法を示します。

RuntimeクラスのAPIも参照してください:http: //docs.oracle.com/javase/7/docs/api/java/lang/Runtime.html

于 2012-09-13T17:47:13.520 に答える
0

Runtime.exec(String)これを行うには良い方法ですが、スクリプトへのパスにスペースが含まれているかどうかに注意する必要があります。より良いアプローチは、を使用することRuntime.exec(String[])です。これにより、Javaがスクリプトパスをスペースで分割するのではなく、1つのコマンドパラメータとして扱うようになります。

Process process = Runtime.exec(new String[] {shellFilePath});

#!/bin/bashまた、スクリプトの先頭に必ず含めてください。

于 2012-09-13T17:24:52.097 に答える
0

2つの選択肢があります。

  1. Javaのbashスクリプトからロジックを書き直します。これにより、実行速度が速くなり、脆弱性が低下しますが、bashスクリプトが大きくて複雑であるか、誰も理解できないレガシーコードである場合は、必要以上に作業が増える可能性があります。
  2. ProcessBuilder;を使用してbashスクリプトを実行します。コマンドライン引数を渡すことができます。これには、2つのプロセス間の調整に関係する独自の一連の問題が伴います。bashスクリプトが入力を期待しない場合は、少し簡単ですが、一般に、スクリプトを開始し、入力ハンドラーと出力ハンドラーを別々のスレッドで実行して、終了を待つ必要があります。Webには良い例がありますが、これを行ったことがない場合、これを正しく理解するのは少し難しいです。
于 2012-09-13T17:25:43.160 に答える