我有一个样本EXE打印在输出下面.
EXE输出:
1
2
3
4
5
Failed
Run Code Online (Sandbox Code Playgroud)
java中的等效代码:
for (int i = 1; i <= 5; i++){
System.out.println(i);
}
System.out.println("Failed");
Run Code Online (Sandbox Code Playgroud)
当尝试使用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.
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
1
3
5
Run Code Online (Sandbox Code Playgroud)
从上面的输出中可以清楚地看到我们缺少像这样的数据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 ();
}
}
Run Code Online (Sandbox Code Playgroud)
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.
}
}
Run Code Online (Sandbox Code Playgroud)
看起来输入流读取器正在通过一次跳过一行来读取.
EDIT2:
因为我想到了InputStreamReader甚至缺少数字行,我在EXE(一个python脚本)中进行了更改,从而打印1到6然后失败.
修改后的EXE输出:
1
2
3
4
5
6
Failed
Run Code Online (Sandbox Code Playgroud)
现在InputStreamReader输出是
Java输出:
1
3
5
Failed
Run Code Online (Sandbox Code Playgroud)
因为我以为我错过了奇数行.有人可以告诉我原因吗?
注意:
问题是由于读取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.
}
}
Run Code Online (Sandbox Code Playgroud)
因此出现了问题。为了解决这个问题,我只读取一次 inputStream 。
while ((line = br.readLine()) != null) {
System.out.println(line);
if(line.toLowerCase().contains("failed")){
#Apply business Rule.
}
}
Run Code Online (Sandbox Code Playgroud)