我们有一个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
答案 0 :(得分:7)
getErrorStream不会读取错误流,它只是获取一个句柄。因为它是一个管道,如果你从未真正读过它,它将填满并强制Perl程序阻止。
您需要以下内容:
Inputstream errors = getErrorStream();
while (errors.read(buffer) > 0) {
SOP buffer;
}
答案 1 :(得分:4)
要考虑的另一个因素是管道进程发生的缓冲。
默认情况下,创建进程间管道的shell维护一个30行的缓冲区,因此如果Perl应用程序没有创建足够的数据,它将不会被发送到Java申请尚未处理。
答案 2 :(得分:4)
可能this thread可能导致您的问题:
在Perl脚本的顶部添加3行:
use IO::Handle;
STDOUT->autoflush(1);
STDERR->autoflush(1);
上述线程中的问题与“Perl缓冲其输出的方式”有关。
但是在这里,Adrian Pronk在评论中提到“Perl因为Java从不读取输出而挂起”。
答案 3 :(得分:4)
理想情况下,我认为为避免死锁,在Java中,您需要生成单独的线程来读取STDERR和STDOUT。听起来Perl在写入STDERR时会阻塞,因为出于这样或那样的原因,你永远不会在Java中读取它。
答案 4 :(得分:0)
STDOUT->autoflush(1);
STDERR->autoflush(1);
这是我需要的信息!
我有一个运行一些Perl脚本的Java应用程序,我只在完成后获得输出。
通过添加autoflush(1)
我马上得到它。
顺便说一句,我确实有单独的帖子来阅读STDERR
和STDOUT
,这就是你要走的路。
感谢。