ProcessBuilder를 사용하여 프로세스를 구성할 때 stdout 및/또는 stderr을 캡처하여 System.out으로 비동기적으로 리디렉션하는 것이 바람직할 수 있습니다. stdOut에서 지속적으로 읽기 위해 스레드를 수동으로 생성하는 것과 같은 기존 접근 방식은 번거롭고 비효율적입니다.
다행히도 Java 7에서는 하위 프로세스 표준 I/O를 동일하게 편리하게 설정하는 ProcessBuilder.inheritIO 메서드를 도입했습니다. 현재 Java 프로세스로. 이렇게 하면 추가 스레드나 복잡한 출력 리디렉션 논리가 필요하지 않습니다.
Java 7 이상의 경우 간단히 호출하세요.
Process p = new ProcessBuilder().inheritIO().command("command1").start();
이전 버전의 Java의 경우 사용자 지정 솔루션이 필요합니다.
public static void main(String[] args) throws Exception { Process p = Runtime.getRuntime().exec("cmd /c dir"); inheritIO(p.getInputStream(), System.out); inheritIO(p.getErrorStream(), System.err); } private static void inheritIO(final InputStream src, final PrintStream dest) { new Thread(new Runnable() { public void run() { Scanner sc = new Scanner(src); while (sc.hasNextLine()) { dest.println(sc.nextLine()); } } }).start(); }
이 사용자 정의 솔루션에서는 src 스트림이 EOF에 도달하여 하위 프로세스가 완료되면 스레드가 자동으로 종료됩니다. 이를 통해 명시적인 스레드 처리 없이도 적절한 리소스 관리가 보장됩니다.
위 내용은 Java에서 ProcessBuilder 출력을 비동기식으로 효율적으로 리디렉션하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!