使用输入流读取器读取时缺失一行

7

我有一个示例exe,它会打印以下输出。

exe的输出:

1
2
3
4
5
Failed

在Java中的等效代码:

for (int i = 1; i <= 5; i++){
     System.out.println(i);
}
System.out.println("Failed");

当尝试使用Java代码启动EXE并读取输出时,一些数据会丢失。
查找用于启动资产的Java代码。 Java代码:
String[] commands = new String[] {"sample.exe" };
p = Runtime.getRuntime().exec(commands);
InputStream is = p.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
while  ((line = br.readLine()) != null) {
    line = br.readLine()
    System.out.println(line);
    if(line.toLowerCase().contains("failed")){
           #Apply business Rule.
    }
}

输出:

1
3
5

从上面的输出可以看出,我们缺少数据,例如2,3,5,failed

我认为在使用InputStreamReader读取之前,资产已经完成了。有没有办法让资产等待,直到我们使用InputStreamReader读取并开始下一组指令,或者有其他更好的方法来解决这个问题。

编辑1:

在我的原始代码中,我还同时读取错误流,请查看以下代码。

ErrorStreamReader:

public void run () {
    try {

        InputStreamReader isr = new InputStreamReader (is);
        BufferedReader br = new BufferedReader (isr); 
        while (true) {
                String s = br.readLine ();
                System.out.println(s+"error Stream");
                if (s == null) break;
            }

    is.close ();    
    } catch (Exception ex) {
        System.out.println ("Problem reading stream " + name + "... :" + ex);
        ex.printStackTrace ();
    }
}

EXE执行Java代码:

String[] commands = new String[] {"sample.exe" };
p = Runtime.getRuntime().exec(commands);
Thread errorStream = new Thread(new ReadStream("stderr", 
    p.getErrorStream ()) # Reads error Stream In parallel
InputStream is = p.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
while  ((line = br.readLine()) != null) {
    line = br.readLine()
    System.out.println(line);
    if(line.toLowerCase().contains("failed")){
           #Apply business Rule.
    }
}

看起来输入流阅读器每次跳过一行进行读取。
编辑2:
由于我认为InputStreamReader漏掉了偶数行,因此我对EXE(一个Python脚本)进行了更改,以打印从1到6,然后失败了。
修改后的EXE输出:
1
2
3
4
5
6
Failed

现在 InputStreamReader 的输出为:

Java 输出:

1
3
5
Failed

我发现我缺少了奇数行,请问有人知道原因吗?


注意:

问题是由于两次读取inputStream导致的,对此造成的不便我深感抱歉。非常抱歉。


3
看起来你的方向有误...这段代码看起来很好,应该能够实现你所描述的功能。sample.exe将会返回你所见到的结果。 - mtk
@ThomasPhilipp 这个示例exe将所有内容都打印到标准输出流中,但“failed”没有以CR / LF终止。 我想知道它应该以CR / LF结尾的原因是什么? - The6thSense
@ThomasPhilipp 流已关闭,我在EXE中做了一点小改动,发现了另一件事情。请查看编辑。 - The6thSense
2
@The6thSense 也许你可以自己添加一个答案并接受它,这将向所有人显示问题已关闭。 - Benoit
1
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Alexey Ivanov
显示剩余9条评论
1个回答

4
问题是由于两次读取inputStream所致。
while  ((line = br.readLine()) != null) {
    line = br.readLine() # input stream read here twice
    System.out.println(line);
    if(line.toLowerCase().contains("failed")){
           #Apply business Rule.
    }
}

因此出现了问题。为了解决这个问题,我只读取了一次inputStream。
while  ((line = br.readLine()) != null) {
    System.out.println(line);
    if(line.toLowerCase().contains("failed")){
           #Apply business Rule.
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接