Rumah >Java >javaTutorial >Bagaimana untuk Mencapai Ubah Arah Output Tidak Menyekat untuk ProcessBuilder?

Bagaimana untuk Mencapai Ubah Arah Output Tidak Menyekat untuk ProcessBuilder?

Barbara Streisand
Barbara Streisandasal
2024-11-28 05:57:09252semak imbas

How to Achieve Non-Blocking Output Redirection for ProcessBuilder?

Ubah Hala Keluar Tanpa Sekat untuk ProcessBuilder

Untuk melaksanakan proses dalam Java, ProcessBuilder menawarkan pendekatan yang mudah. Walau bagaimanapun, cabaran timbul apabila kita perlu mengubah hala strim stdout dan stderr secara tak segerak bagi proses yang dilaksanakan ke System.out.

Asynchronous Redirection using Thread

Satu kaedah biasa melibatkan penumbuhan benang baharu secara manual yang membaca secara berterusan daripada stdOut dan menulis ke Sistem.keluar. Walaupun berfungsi, pendekatan ini mencipta overhed pengurusan benang tambahan.

Penyelesaian Elegan dengan ProcessBuilder.inheritIO

Jika Java 7 atau lebih baru tersedia, ProcessBuilder menyediakan yang lebih ringkas dan lebih elegan penyelesaian: ProcessBuilder.inheritIO. Kaedah ini menetapkan strim I/O standard subproses untuk mewarisi proses Java induk.

Menggunakan inheritIO adalah mudah:

Process p = new ProcessBuilder().inheritIO().command("command1").start();

Alternatif untuk Versi Java Terdahulu

Untuk versi Java sebelum 7, pelaksanaan berikut boleh digunakan:

import java.io.*;
import java.util.Scanner;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class NonBlockingOutputRedirection {
    public static void main(String[] args) throws Exception {
        ExecutorService executorService = Executors.newSingleThreadExecutor();
        Process p = Runtime.getRuntime().exec("cmd /c dir");
        inheritIO(p.getInputStream(), System.out, executorService);
        inheritIO(p.getErrorStream(), System.err, executorService);
    }

    private static void inheritIO(final InputStream src, final PrintStream dest, ExecutorService executorService) {
        executorService.execute(() -> {
            Scanner scanner = new Scanner(src);
            while (scanner.hasNextLine()) {
                dest.println(scanner.nextLine());
            }
        });
        executorService.shutdown();
    }
}

Kelebihan Kaedah ini

Kaedah ini menawarkan beberapa kelebihan:

  • Asynchronous: Ubah hala keluaran berlaku di latar belakang, membebaskan yang utama benang.
  • Penamatan Benang Automatik: Apabila subproses selesai, urutan yang bertanggungjawab untuk pengalihan semula output akan ditamatkan secara automatik disebabkan oleh akhir fail pada aliran input.

Secara keseluruhannya, menggunakan ProcessBuilder.inheritIO dalam Java 7 atau lebih baru, atau pelaksanaan alternatif untuk versi terdahulu, menyediakan yang bersih dan cekap cara untuk mencapai pengalihan keluaran tanpa sekatan untuk proses yang dimulakan dengan ProcessBuilder.

Atas ialah kandungan terperinci Bagaimana untuk Mencapai Ubah Arah Output Tidak Menyekat untuk ProcessBuilder?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn