2010-07-12 2 views
5

1) J'utilise Java pour appeler terminal Linux pour exécuter foo.exe et enregistrer la sortie dans un fichier:Utiliser Java pour appeler le terminal Linux: Comment vider la sortie?

String[] cmd = {"/bin/sh", "-c", "foo >haha.file"}; 
    Runtime.getRuntime().exec(cmd); 

2) Le problème est quand je prévois de lire haha.file plus tard dans le code , il n'a pas été encore écrit:

File f=new File("haha.file"); // return true 
in = new BufferedReader(new FileReader("haha.file")); 
reader=in.readLine(); 
System.out.println(reader);//return null 

3) seulement après que le programme est fait sera le haha.file être écrit. Je sais seulement comment vider les "Ecrivains" mais je ne sais pas comment tirer sur sth. comme ça. Comment puis-je forcer java à écrire le fichier dans le terminal?

Merci à l'avance E.E.

Répondre

0

Vous pouvez attendre la fin du processus:

Process p = Runtime.getRuntime().exec(cmd); 
int result = p.waitFor(); 

Ou utilisez le p.getInputStream() pour lire directement à partir de la sortie standard du processus.

2

Ce problème est dû à la nature asynchrone de Runtime.exec. foo est en cours d'exécution dans un processus séparé. Vous devez appeler le Process.waitFor() pour vous assurer que le fichier a été écrit.

String[] cmd = {"/bin/sh", "-c", "foo >haha.file"}; 
Process process = Runtime.getRuntime().exec(cmd); 
// .... 
if (process.waitFor() == 0) { 
    File f=new File("haha.file"); 
    in = new BufferedReader(new FileReader("haha.file")); 
    reader=in.readLine(); 
    System.out.println(reader); 
} else { 
    //process did not terminate normally 
} 
+1

Soyez prudent avec cette approche. Il y a des méchants avec le flux stdout/stderr lors de l'utilisation de exec(). Vous avez vraiment besoin de consommer ASYNCHRONUSUSEMENT les flux de sortie/erreur pendant que waitFor() bloque sinon il ne peut jamais retourner car les tampons stdout/err se remplissent et bloquent les processus bifurqués. Checkout apache commons-exec pour une lib qui résout cela. –

Questions connexes