Pertanyaan Mengapa program Java saya tidak bisa membaca STDERR Perl?


Kami memiliki program Perl untuk memvalidasi XML yang dipanggil dari program Java. Tidak dapat menulis ke standard error dan menggantung di lokasi cetak.

Perl menulis ke STDERR dan program java membaca STDERR menggunakan fungsi getErrorStream (). Tetapi program Perl digantung untuk menulis ke STDERR. Saya menduga fungsi Java memblokir aliran STDERR sepenuhnya dan Perl sedang menunggu aliran ini dirilis.

Apakah ada cara di Perl untuk mengatasi penyumbatan ini dan menulis ke kesalahan standar dengan paksa? Karena Java melakukan hanya membaca API tidak boleh mengunci aliran STDERR per java doc.

Potongan kode Perl adalah:

sub print_error
{
    print STDERR shift;
}

Potongan kode Java adalah:

while ( getErrorStream() != null )
{
    SOP errorMessage;
}

Hargai bantuan di muka.

Terima kasih, Mathew Liju


5
2017-12-10 07:10


asal


Jawaban:


getErrorStream tidak Baca baca aliran kesalahan, itu hanya mendapatkan pegangan untuk itu. Seperti sebuah pipa, jika Anda tidak pernah benar-benar membacanya, itu akan mengisi dan memaksa program Perl untuk memblokir.

Anda membutuhkan sesuatu seperti:

Inputstream errors = getErrorStream();
while (errors.read(buffer) > 0) {
    SOP buffer;
}

7
2017-12-10 07:40



Idealnya, saya pikir untuk menghindari kebuntuan, di Jawa Anda perlu menelurkan utas yang terpisah untuk membaca STDERR dan STDOUT. Kedengarannya seperti Perl memblokir ketika menulis ke STDERR karena untuk satu alasan atau yang lain Anda tidak pernah membaca dari itu di Jawa.


4
2017-12-10 14:58



Faktor tambahan yang perlu dipertimbangkan adalah buffering yang terjadi dengan proses pipan.

Ada secara default, sekitar 30-line-ish buffer yang dikelola oleh shell menciptakan pipa antar-proses, jadi jika aplikasi Perl belum membuat cukup data, itu tidak akan dikirim ke aplikasi Java belum proses.


4
2017-12-10 07:27



Mungkin utas ini memiliki kemungkinan penyebab masalah Anda:

Tambahkan 3 baris ke bagian atas skrip Perl:

use IO::Handle;
STDOUT->autoflush(1);
STDERR->autoflush(1);

Masalah dalam thread yang disebutkan terkait dengan "cara Perl menyangga outputnya".

Namun di sini, Adrian Pronk menyebutkan di komentar bahwa "Perl menggantung karena Java tidak pernah membaca outputnya".


4
2017-12-10 07:27



STDOUT->autoflush(1);
STDERR->autoflush(1);

Ini adalah informasi yang saya butuhkan! Saya memiliki aplikasi Java yang menjalankan beberapa skrip Perl dan saya hanya mendapatkan hasilnya setelah selesai. Dengan menambahkan autoflush(1) Saya segera mendapatkannya.

BTW, saya punya utas utk membaca STDERR dan STDOUT, dan itulah caranya.

Terima kasih.


0
2017-11-24 18:20