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
Lepaskan: 2024-11-28 05:57:09
asal
209 orang telah melayarinya

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();
Salin selepas log masuk

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();
    }
}
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan