>Java >java지도 시간 >Java에서 ProcessBuilder 출력을 비동기식으로 효율적으로 리디렉션하는 방법은 무엇입니까?

Java에서 ProcessBuilder 출력을 비동기식으로 효율적으로 리디렉션하는 방법은 무엇입니까?

DDD
DDD원래의
2024-11-23 20:38:11715검색

How to Efficiently Redirect ProcessBuilder Output Asynchronously in Java?

ProcessBuilder 프로세스에 대한 비동기 출력 리디렉션

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.