Java 程序執行外部程式造成阻塞的一種因

NO IMAGE

查了好多資料,差點就動手翻Java原始碼了,最後結合一篇文章(忘記出處了),想到了輸出流會阻塞程序執行。 Java程序執行有一個輸入流,兩個輸出流(相對於外部程式)。當兩個輸出流有內容輸出,而Java執行程式沒有及時清空輸出流時就會阻塞程序。
現貼出程式碼,希望能幫助到有需要的同行:

複製程式碼 程式碼如下:/**
  * pdf轉swf函式
  * @param path 輸入輸出檔案路徑
  * @param inputFileName 輸入檔名
  * @param outputFileName 輸出檔名
  * @return File 生成的swf檔案
  */
 private static File toSwf(String sourceFile, String destFile, String command) {
  long beginTime = System.nanoTime();
  Runtime rt = Runtime.getRuntime();
  try {
   Process process = rt.exec(command);

   final InputStream isNormal = process.getInputStream();
   new Thread(new Runnable() {
       public void run() {
           BufferedReader br = new BufferedReader(new InputStreamReader(isNormal));
           StringBuilder buf = new StringBuilder();
     String line = null;
     try {
      while((line = br.readLine()) != null){
       buf.append(line “\n”);
      }
     } catch (IOException e) {
      e.printStackTrace();
     }
     System.out.println(“輸出結果為:” buf);
       }
   }).start(); // 啟動單獨的執行緒來清空process.getInputStream()的緩衝區

   InputStream isError = process.getErrorStream();
   BufferedReader br2 = new BufferedReader(new InputStreamReader(isError));
   StringBuilder buf = new StringBuilder();
   String line = null;
   while((line = br2.readLine()) != null){
    buf.append(line “\n”);
   }
   System.out.println(“錯誤輸出結果為:” buf);

   try {
    process.waitFor();
   } catch (InterruptedException e) {
    e.printStackTrace();
   }

  } catch (IOException e) {
   e.printStackTrace();
  }
  long endTime = System.nanoTime();
  System.out.println(“轉swf耗時: ” (endTime – beginTime) / 1000000000 ” 秒  ” sourceFile);
  return new File(destFile);
 }

您可能感興趣的文章:

Java基於Runtime呼叫外部程式出現阻塞的解決方法Java 常見異常(Runtime Exception )詳細介紹並總結Java異常處理執行時異常(RuntimeException)詳解及例項Java Runtime類詳解_動力節點Java學院整理解析Java的Spring框架的BeanPostProcessor釋出處理器Java Process類的詳解及例項程式碼Java Process詳解及例項oracle如何使用java source呼叫外部程式Java程式設計使用Runtime和Process類執行外部程式的方法