我有一个示例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导致的,对此造成的不便我深感抱歉。非常抱歉。