이 기사의 예에서는 매우 실용적인 기술인 런타임 기반의 Java에서 호출되는 외부 프로그램 차단에 대한 솔루션을 설명합니다. 참고할 수 있도록 모든 사람과 공유하세요. 구체적인 분석은 다음과 같습니다.
때로는 swf를 변환하는 SwfTools, 비디오를 변환하는 ffmpeg 등과 같은 일부 외부 프로그램이 Java 코드에서 호출됩니다. 코드가 Runtime.getRuntime().exec(command)와 같이 작성된 경우 프로그램은 즉시 실행되지만 Java는 실행을 기다리지 않기 때문에 명령줄에서 실행하는 데 시간이 걸립니다. 외부 프로그램을 완료하려면 차단을 사용하여 외부 프로그램의 실행 결과를 기다려야 합니다.
InputStream stderr = process.getInputStream();InputStreamReader isr = new InputStreamReader(stderr, "GBK");BufferedReader br = new BufferedReader(isr);String line = null;while ((line = br.readLine()) != null ) System.out.println(line);int exitValue = process.waitFor();
일반적인 외부 프로그램의 경우 위의 차단 코드를 사용하면 최소한 pdf2swf.exe에는 문제가 없습니다.
그러나 ffmpeg의 경우 위 코드로 인해 프로그램이 중단되고 다른 방법을 사용하여 다음과 같이 이를 메서드로 캡슐화해야 한다는 사실을 발견했습니다.
@SuppressWarnings("static-access")public static int doWaitFor(Process process) { InputStream in = null; InputStream err = null; intexitValue = -1; // p가 완료되면 호출자에게 반환됨 try { in = process.getInputStream (); err = process.getErrorStream(); boolean done = false; // p가 완료되면 true로 설정됩니다. while (!finished) { try { while (in.available() > 0) { // 시스템 호출의 출력을 인쇄합니다. Character c = new Character((char) in.read()) System.out.print(c) } while (err.available) () > 0) { // 시스템 호출의 출력을 인쇄합니다. Character c = new Character((char) err.read(c)); System.out.print(c) } // 프로세스에 종료 값을 요청합니다. 프로세스가 // 완료되지 않은 경우 IllegalThreadStateException이 발생하고 // 완료되면 종료되고 // 변수가 true로 설정됩니다.exitValue = process.exitValue(); done = true; 아직 완료됨; // CPU 주기를 절약하기 위해 잠시 잠자기 Thread.currentThread().sleep(500) } } } catch (Exception e) { e.printStackTrace() } 마지막으로 { if (in != null) { in.close() } } catch (IOException e) { e.printStackTrace() } if (err != null); err.close(); } catch (IOException e) { e.printStackTrace() } } } returnexitValue;}이 기사에서 설명하는 내용이 모든 사람의 Java 프로그래밍 학습에 도움이 되기를 바랍니다.