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 + "
");
      }
     } 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 + "
");
   }
   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);
 }

좋은 웹페이지 즐겨찾기