2016-04-04 2 views
0

Ich habe viele Threads über das Laufen der externen Programme überprüft, aber sie können mein Problem nicht lösen. für die Ausführung von Siesta (DFT Berechnung) Ich habe so etwas wie diese verwenden (Si.fdf ist die Eingabedatei): Siesta < Si.fdf Ich verwende diesen Code:Laufendes externes Programm (Siesta) durch 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; 

}

, aber dieser Code läuft nur Siesta ohne Eingabedatei.

+0

Sie lesen den 'stdout' des Kindprozesses über' p.getInputStream() '. Sie müssen Ihre Daten über 'p.getOutputStream()' in die 'stdin' des Kindprozesses einspeisen. Hinzufügen von '

+0

Ich habe den OutputStream verwendet out = p.getOutputStream(); out.write (" user3578884

+0

Ich meinte, dass Sie den ** Inhalt ** Ihrer Eingabedatei in die 'stdin' Ihres Kindprozesses schreiben sollten. Du hast dein Problem gelöst, indem du Bash hast, der für dich arbeitet; Bash versteht das Zeichen '<' als eine Anweisung, um die Eingabedatei zu lesen und ihren Inhalt in 'stdin' von Siesta zu schreiben. Java interpretiert das Zeichen <

Antwort

0

Endlich habe ich das gelöst. Ich füge eine Batch-Datei zum Terminal hinzu, die das Programm seinen Inhalt kontrolliert. Durch das Ausführen dieser Batch-Datei wurde das Problem behoben.

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(); 
} 
Verwandte Themen