У меня есть образец EXE, который печатает ниже вывода.
Вывод EXE:
1
2
3
4
5
Failed
эквивалентный код в Java:
for (int i = 1; i <= 5; i++){
System.out.println(i);
}
System.out.println("Failed");
При попытке инициировать EXE с помощью кода Java и прочитать вывод некоторые данные пропадают.
Найдите 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 ();
}
}
Java-код исполнителя EXE:
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) для печати с 1
на 6
, а затем потерпел неудачу.
Измененный вывод EXE:
1
2
3
4
5
6
Failed
Теперь вывод InputStreamReader был
Вывод Java:
1
3
5
Failed
Как я думал, мне не хватает строк с нечетными номерами. Может кто-нибудь, пожалуйста, дайте мне знать причину?
Примечание.
Проблема возникла из-за чтения inputStream Twice, извините за причиненные неудобства. Мне очень жаль.