[英]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)
我馬上得到它。
順便說一句,我確實有單獨的線程來讀取STDERR
和STDOUT
,這就是要走的路。
謝謝。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.