2016-03-11 1 views
0

J'ai essayé beaucoup d'options différentes, mais rien ne semble fonctionner. Je ne peux pas obtenir mon code pour produire une chaîne à la "console" d'un processus. Voici mon code:BufferedWriter vers l'entrée ProcessBuilder?

Process p; 
    // Create new ProcessBuilder 
    ProcessBuilder pb = new ProcessBuilder("java", "-jar", "jar-location").inheritIO(); 
    // Change work directory 
    pb.directory(new File("other-location")); 
    // Redirect output 
    pb.redirectOutput(new File("C:\\xampp\\htdocs\\log.json")); 
    // Start ProcessBuilder 
    p = pb.start(); 
    OutputStream stdin = p.getOutputStream(); 
    BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(stdin)); 
    while(!done) { 
     try { 
      if(go != null) { 
       writer.write(formatted[0]) 
      } 
      Thread.sleep(1000); 
     } 
     catch(Exception err) { 
      System.out.println(err); 
     } 
    } 

« p » est le processus que je suis en train de présenter à l'entrée et « formaté » est un tableau de données. Lorsque vous exécutez cela, rien ne se passe. J'ai essayé de rincer/fermer l'auteur, mais je ne peux pas l'obtenir dans un endroit sans obtenir "Java IO Exception: Stream Closed". Quelqu'un peut-il dire ce qui ne va pas avec mon code?

Stacktrace:

Exception in thread "main" java.io.IOException: Stream closed 
    at java.lang.ProcessBuilder$NullOutputStream.write(ProcessBuilder.java:433) 
    at java.io.OutputStream.write(OutputStream.java:116) 
    at sun.nio.cs.StreamEncoder.writeBytes(StreamEncoder.java:221) 
    at sun.nio.cs.StreamEncoder.implClose(StreamEncoder.java:316) 
    at sun.nio.cs.StreamEncoder.close(StreamEncoder.java:149) 
    at java.io.OutputStreamWriter.close(OutputStreamWriter.java:233) 
    at java.io.BufferedWriter.close(BufferedWriter.java:266) 
    at com.Rocket_Scientist.Main.main(Main.java:60) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144) 
+0

Veuillez poster la pile. Aussi, qu'est-ce que 'client'? –

+0

J'ai attaché le stacktrace de quand il se bloque de writer.close(). Le client est juste une source de données pour le formatage, j'aurais probablement pu l'enlever de l'extrait. – user3149832

+0

Que 'ProcessBuilder $ NullOutputStream' est révélateur. Modifiez votre question et affichez le code qui crée ProcessBuilder. De la documentation de ProcessBuilder: "une source d'entrée * standard. * Par défaut, le sous-processus lit l'entrée d'un tube. Le code Java peut accéder à ce canal via le flux de sortie renvoyé par 'Process.getOutputStream()'. Cependant, l'entrée standard peut être redirigée vers une autre source en utilisant 'redirectInput'. Dans ce cas, 'Process.getOutputStream()' retournera un flux de sortie * null, * pour lequel: les méthodes d'écriture lancent toujours IOException; la méthode close ne fait rien. " – VGR

Répondre

0

Je trouve donc le problème, grâce à VGR (merci!). Le ".inheritIO()" redirigeait le flux de sortie, provoquant le problème. Merci!