Привет, я строю графический интерфейс на 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 ~
BufferedReader#readLine()
блокируется до тех пор, пока не будет доступна полная строка, указанная при получении символа новой строки.
Ваш код C ++ выводит подсказку, но без новой строки. Это приводит к readLine()
не возвращаясь, в результате чего поведение, которое вы видите. Если вы хотите, чтобы код Java и C ++ взаимодействовал, вы должны определить «протокол» для связи, когда сообщение завершено и готово к действию. Это может быть как новая строка, так и более сложная, если ваши потребности разные. Это действительно зависит от вас, но если вы имеете дело с какой-то существующей программой на C ++ и хотите управлять ею из Java, вы должны быть готовы с ней справиться.
Например, если программа C ++ запрашивает без перевода строки и вы не можете изменить ее, возможно, вам придется искать двоеточие :
в конце строки приглашения вместо. Это будет означать, что код Java не может использовать readLine()
и должен обрабатывать ввод по одному символу за раз.
Других решений пока нет …