2016-04-04 20 views
0

私は外部プログラムの実行について多くのスレッドをチェックしましたが、私の問題は解決できません。 昼寝< Si.fdf 私はこのコードを使用しています:外部プログラム(シエスタ)をJavaで実行しています

public static void main(String argv[]) throws IOException { 

Runtime r = Runtime.getRuntime(); 
Process p;  
BufferedReader is; 
String line; 

System.out.println("siesta < Si.fdf"); 
p = r.exec("siesta < Si.fdf"); 

System.out.println("In Main after exec"); 
is = new BufferedReader(new InputStreamReader(p.getInputStream())); 

while ((line = is.readLine()) != null) 
    System.out.println(line); 

System.out.println("In Main after EOF"); 
System.out.flush(); 
try { 
    p.waitFor(); 
} catch (InterruptedException e) { 
    System.err.println(e); // 
    return; 
} 
System.err.println("Process done, exit status was " + p.exitValue()); 
return; 

}

を、私はこのようなものを使用する必要がありシエスタ(DFT計算)を実行するための (Si.fdfは、入力ファイルがあります)

しかし、このコードは入力ファイルなしでSiestaのみを実行します。

+0

あなたは 'p.getInputStream()'によって子プロセスの 'stdout'を読んでいます。 'p.getOutputStream()'を使って子プロセスの 'stdin'にデータを送る必要があります。あなたの 'Runtime.exec()'パラメータに '

+0

私は OutputStream out = p.getOutputStream()を使用しました。 out.write( " user3578884

+0

私はあなたの入力ファイルの**コンテンツ**をあなたの子プロセスの 'stdin'に書くべきだということを意味しました。あなたはあなたの問題をBashに任せて解決しました。 Bashは、文字 '<'を入力ファイルを読み込み、その内容をシエスタの 'stdin'に書き込む命令として理解しています。 Javaはそのような '<'文字を解釈せず、Unixシェルではありません。 Javaで同じことを実現するには、入力ファイルの内容を読み込み、子プロセスの 'stdin'にそれらをプッシュするBashの動作を再作成する必要があります。 –

答えて

0

最後にこれを解決しました。プログラムがその内容を制御するバッチファイルを端末に追加します。このバッチファイルを実行することで、問題は解決しました。

public static void writeBatchFile(String batchFileName, String fileName, String inputFile) throws Exception{ 
    FileWriter write = new FileWriter(batchFileName); 
    PrintWriter print_line = new PrintWriter(write); 
    print_line.println("#!/bin/bash"); 
    print_line.println("siesta < "+ inputFile +".fdf"+ " > " + fileName + ".out"); 
    print_line.close(); 
} 
関連する問題