2017-04-05 95 views
-3

我在Java中創建了一個Process對象(如果這很重要,那麼程序是html tidy),通過stdin(Process.getOutputStream())提供一些數據並關閉流,但是當我調用Process.waitFor()它永遠不會返回,因爲該進程不會退出。如何解決此問題而不致電Process.destroy()unix命令行程序在關閉stdin後不退出

+1

不,我只是無法找到這個答案別的地方,並認爲別人可能會從我所學到的東西中受益。 –

+0

你們爲什麼不投票呢?我需要改述我的問題嗎? –

+1

你真的需要一個相同答案的Unix版本嗎? – Andreas

回答

-3

tidy有可能在您退出前等待您使用輸出。如果您只是給程序提供大量數據並且它會爲您返回大量數據,則可能會發生這種情況。解決方案是在等待程序退出之前消耗輸出。這是我如何處理它(不是完整的代碼):

ProcessBuilder builder = new ProcessBuilder(); 
    //-*snip*- 
    Process p = null; 
    Throwable error = null; 
    int returnCode = -1; 
    String output = null; 
    StringBuilder stdErr = new StringBuilder(200); 
    try{ 
     p = builder.start(); 
     try (Writer w = new BufferedWriter(new OutputStreamWriter(p. 
       getOutputStream()))){ 
      w.write(html); 
     } 
     Process reference = p; 
     //read both outputs so tidy has no reason to wait 
     Thread errReader = new Thread(()->{ 
      StringBuilderWriter writer = new StringBuilderWriter(stdErr); 
      try { 
       IOUtils.copy(reference.getErrorStream(), writer, 
         Charsets.UTF_8); 
      } 
      catch (IOException ex) { 
       //nom... 
       //An IOE that happens here will likely happen when reading 
       //stdout as well. 
      } 
     }); 
     errReader.start(); 
     //tidy might be waiting for us to consume output 
     output = IOUtils.toString(p.getInputStream()); 
     returnCode = p.waitFor(); 
     errReader.join(); 
    } 
+0

由於您想讓其他人發現問題,作爲重複問題的墊腳石,您可以通過刪除答案來清除負面答覆給您的問題來恢復某些答案。 – Andreas

+0

我可以,但答案可能對某人有用,並沒有那麼多的代表。我寧願幫助別人,也不願意擁有豐富的代表。 –