繁体   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