Java-файл ProcessBuilder EXE не получает правильно входящий поток

Привет, я строю графический интерфейс на Java для программы на C ++, и я застрял с ProcessBuilder, который вызывает мой exe-файл.

Я сделал эту маленькую программу на C ++ только для того, чтобы протестировать эту вещь ProcessBuilder и посмотреть, смогу ли я контролировать потоки ввода / вывода:

#include <cstdlib>
#include<stdio.h>

int main(int argc, char** argv) {
int testInteger;
int a = 1;
while (a==1){
printf("Enter an integer: ");
scanf("%d",&testInteger);
if (testInteger == 0){
printf("Quitting program!");
return 0;
}else{
printf("You entered the number = %d\n",testInteger);
}
}
return 0;
}

Мой код Java выглядит следующим образом:

public static void main(String[] args) throws InterruptedException, IOException{ProcessBuilder pb = new ProcessBuilder("./i_o_test");
Process process = pb.start();

InputStream is = process.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String line;
while ((line=br.readLine()) != null){

System.out.println(line);
}

}

Код не выдает никакой ошибки и просто висит в цикле while. Он ничего не печатает.
Этот код прекрасно работает с такими командами, как «echo», поэтому я не знаю, что я здесь делаю неправильно.

(если у вас, ребята, есть лучшее предложение взять под контроль потоки ввода / вывода в exe-процессе c ++ из Java, отличного от ProcessBuilder, я все у вас)

Заранее спасибо,
Maarc ~

0

Решение

BufferedReader#readLine() блокируется до тех пор, пока не будет доступна полная строка, указанная при получении символа новой строки.

Ваш код C ++ выводит подсказку, но без новой строки. Это приводит к readLine() не возвращаясь, в результате чего поведение, которое вы видите. Если вы хотите, чтобы код Java и C ++ взаимодействовал, вы должны определить «протокол» для связи, когда сообщение завершено и готово к действию. Это может быть как новая строка, так и более сложная, если ваши потребности разные. Это действительно зависит от вас, но если вы имеете дело с какой-то существующей программой на C ++ и хотите управлять ею из Java, вы должны быть готовы с ней справиться.

Например, если программа C ++ запрашивает без перевода строки и вы не можете изменить ее, возможно, вам придется искать двоеточие : в конце строки приглашения вместо. Это будет означать, что код Java не может использовать readLine() и должен обрабатывать ввод по одному символу за раз.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]