سؤال

عند إطلاق عملية من Java، يمكن لكل من stderr وstdout حظر الإخراج إذا لم أقرأ من الأنابيب.لدي حاليًا موضوع يقرأ بشكل استباقي من أحدهما وكتل الخيط الرئيسية من جهة أخرى.

هل هناك طريقة سهلة للانضمام إلى التدفقين أو التسبب في استمرار العملية الفرعية دون فقدان البيانات في stderr؟

هل كانت مفيدة؟

المحلول

قم بتعيين خاصية redirectErrorStream على ProcessBuilder لإرسال مخرجات stderr إلى stdout:

ProcessBuilder builder = new ProcessBuilder(command);
builder.redirectErrorStream(true);

يجب عليك بعد ذلك إنشاء سلسلة رسائل للتعامل مع تدفق العملية، كما يلي:

Process p = builder.start();

InputHandler outHandler = new InputHandler(p.getInputStream());

حيث يتم تعريف InputHandler على النحو التالي:

private static class InputHandler extends Thread {

    private final InputStream is;

    private final ByteArrayOutputStream os;

    public InputHandler(InputStream input) {
        this.is = input;
        this.os = new ByteArrayOutputStream();
    }

    public void run() {
        try {
            int c;
            while ((c = is.read()) != -1) {
                os.write(c);
            }
        } catch (Throwable t) {
            throw new IllegalStateException(t);
        }
    }

    public String getOutput() {
        try {
        os.flush();
        } catch (Throwable t) {
            throw new IllegalStateException(t);
        }
        return os.toString();
    }

}

وبدلاً من ذلك، ما عليك سوى إنشاء معالجي InputHandlers لـ InputStream وErrorStream.معرفة أن البرنامج سوف يُحظر إذا لم تقرأه هو 90% من المعركة :)

نصائح أخرى

هل لديك موضوعين فقط، أحدهما يقرأ من stdout والآخر من stderr؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top