2012-10-22 1 views
1

Pour une raison quelconque, ce code ne fonctionne que lorsque je ferme le flux de sortie. Comment puis-je le faire fonctionner sans avoir à le fermer? Je veux le garder ouvert afin que je puisse continuer à envoyer des données au processus sans le redémarrer.E/S Java sur le tube

ProcessBuilder pbuilder = new ProcessBuilder(procCmds); 
      pbuilder.directory(new File(workingDir)); 
      Process p = pbuilder.start(); 

    BufferedWriter outputStream = new BufferedWriter(new OutputStreamWriter(p.getOutputStream())); 
    String str = "hello world heard from java\n"; 
    outputStream.write(str, 0, str.length()); 
    outputStream.flush(); 
    System.out.println("wrote " + str); 
    BufferedReader errorStream = new BufferedReader(new InputStreamReader(p.getErrorStream())); 
    BufferedReader inputStream = new BufferedReader(new InputStreamReader(p.getInputStream())); 
    String line = null; 
    while((line=errorStream.readLine())!=null) 
     System.out.println(line); 
    while((line=inputStream.readLine())!=null) 
     System.out.println(line); 

    //p.waitFor(); 
    outputStream.close(); 
    errorStream.close(); 
    inputStream.close(); 
+1

Avez-vous essayé la méthode flush()? – Reddy

+0

Oui, je l'ai fait. C'est dans le code là-bas. outputStream.flush(). – jortiz81

Répondre

1

Vous devez soit fusionner les flux d'erreurs et d'entrées, soit en lire un dans un fil séparé. Actuellement, vous tentez de lire le flux d'erreurs vers EOS, ce qui ne se produit que lorsque le processus se termine, de sorte que vous ne pouvez jamais lire le flux d'entrée. Vous n'obtiendrez pas EOS sur le flux d'entrée avant la sortie du processus, donc la lecture sur EOS n'a pas vraiment de sens non plus si vous avez d'autres sorties à fournir. Vous devriez probablement lire les deux flux dans des fils séparés.

+0

Merci. Fusionner les cours d'eau est la meilleure chose à faire ici. Je n'étais pas au courant que le flux d'erreurs ne renvoie que EOS quand il se termine. Pour confirmer, j'ai supprimé le code de lecture d'erreur et cela a fonctionné. – jortiz81

+0

@jortz Quand pourrait-il éventuellement retourner EOS? Le processus peut écrire sur stderr à n'importe quel moment, donc il ne peut certainement pas le fermer plus tôt. – EJP

+0

Je ne suis pas confus au sujet de la logique derrière le mécanisme, je n'en ai pas tenu compte. En fait, à mon point de vue, cela fonctionne aussi si j'ajoute errorStream.ready() dans la condition de boucle while et que j'emballe l'ensemble dans une boucle while. Le problème est que je bloque jusqu'à ce que l'EOS soit émis. J'ai juste besoin de retirer ce bloc et je suis prêt à partir. La même chose peut être dite pour lire la sortie standard du processus via le flux d'entrée. – jortiz81