簡體   English   中英

為什么我的Java程序不能讀取Perl的STDERR?

[英]Why can't my Java program read Perl's STDERR?

我們有一個Perl程序來驗證從Java程序調用的XML。 它無法寫入標准錯誤並掛在打印位置。

Perl正在寫入STDERR,java程序正在使用getErrorStream()函數讀取STDERR。 但是Perl程序暫時寫入STDERR。 我懷疑Java函數完全阻塞了STDERR流,Perl正在等待這個流被釋放。

在Perl中是否有辦法克服這種阻塞並強行寫入標准錯誤? 由於Java只進行讀取,因此API不應該按照java doc鎖定STDERR流。

Perl Code代碼段是:

sub print_error
{
    print STDERR shift;
}

Java代碼段是:

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

提前感謝您的幫助。

謝謝,Mathew Liju

getErrorStream不讀取錯誤流,它只是獲取它的句柄。 因為它是一個管道,如果你從未真正讀過它,它將填滿並強制Perl程序阻止。

你需要這樣的東西:

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

要考慮的另一個因素是管道進程發生的緩沖。

默認情況下,創建進程間管道的shell維護了大約30行的緩沖區,因此如果Perl應用程序沒有創建足夠的數據,它將不會被發送到Java應用程序處理。

可能是這個帖子可能導致您的問題:

在Perl腳本的頂部添加3行:

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

提到的線程中的問題與“Perl緩沖其輸出的方式”有關。

然而,在這里, Adrian Pronk在評論中提到“Perl因為Java永遠不會讀取它的輸出而掛起”。

理想情況下,我認為為避免死鎖,在Java中,您需要生成單獨的線程來讀取STDERR和STDOUT。 聽起來Perl在寫入STDERR時會阻塞,因為出於這樣或那樣的原因,你永遠不會在Java中讀取它。

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

這是我需要的信息! 我有一個運行一些Perl腳本的Java應用程序,我只在完成后獲得輸出。 通過添加autoflush(1)我馬上得到它。

順便說一句,我確實有單獨的線程來讀取STDERRSTDOUT ,這就是要走的路。

謝謝。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM