繁体   English   中英

使用输入流阅读器读取时缺少行

[英]Missing line when reading using input stream reader

我有一个样本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这样的数据2,3,5,failed

我认为在我们使用InputStreamReader读取之前资产已经完成。 是否有任何方法可以让资产等到我们使用InputStreamReader读取并开始下一组指令,或者还有其他更好的方法来执行此操作。

EDIT1:

在我的原始代码中,我也在并行读取错误流,请找到代码。

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.
    }
}

看起来输入流读取器正在通过一次跳过一行来读取。

EDIT2:

由于我认为InputStreamReader缺少偶数行,我在EXE(一个python脚本)中进行了更改,从16打印然后失败。

修改后的EXE输出:

1
2
3
4
5
6
Failed

现在InputStreamReader输出是

Java输出:

1
3
5
Failed

因为我以为我错过了奇数行。 有人可以告诉我原因吗?


注意:

问题是由于读取inputStream两次抱歉造成的不便。 我非常抱歉。

问题是由于读取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.
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM