Java — Перенаправление вывода программы на вход — канал не работает

Я принимаю вывод одной программы (C ++) в качестве ввода для другой (Java), используя BufferedReader, Когда я запускаю Java-программу в своей IDE и ввожу ввод в консоли, программа работает, как и ожидалось, однако, когда я пытаюсь передать входные данные из программы на C ++, она больше не работает без выдаваемых ошибок — на терминале не отображается вывод окно и данные не вводятся в базу данных. Стоит также отметить, что если я попытаюсь запустить jar в окне терминала и при вводе ввода программа там тоже не работает.

Код читателя:

BufferedReader input;
try {
input = new BufferedReader(new InputStreamReader(System.in));
String outputLine;
String visionObjectName;
String visionObjectTimestamp;
String word = null;
String timestamp = null;
String whiteSpace = null;
// Regex is used to check that the output is an object "name blankSpace timestamp" to avoid random output such as errors being entered.
while ((outputLine = input.readLine()) != null) {
System.out.println(outputLine);
String regEx = "(^[a-zA-Z]*)(\\s+)((?:2|1)\\d{3}(?:-|\\/)(?:(?:0[1-9])|(?:1[0-2]))(?:-|\\/)(?:(?:0[1-9])|(?:[1-2][0-9])|(?:3[0-1]))(?:T|\\s)(?:(?:[0-1][0-9])|(?:2[0-3])):(?:[0-5][0-9]):(?:[0-5][0-9]))";
Pattern p = Pattern.compile(regEx, Pattern.CASE_INSENSITIVE | Pattern.DOTALL);
Matcher m = p.matcher(outputLine);
if (m.find()) {
word = m.group(1);
whiteSpace = m.group(2);
timestamp = m.group(3);
}
visionObjectName = word + "" + whiteSpace;
visionObjectTimestamp = timestamp;
databasePopulation(visionObjectName, visionObjectTimestamp);
}

Я использую функцию конвейера Linux для передачи информации.

Команда:

./ORBMarkerDetection | java -jar ../layers/out/artifacts/layers_jar/layers.jar

РЕДАКТИРОВАТЬ:
Ради тщательности я включил выходной код из программы на C ++, не вызовет ли метод, который я использую для печати отметки времени, проблемы?

int timeFound() {
time_t rawtime;
struct tm * timeinfo;
char buffer [80];
time(&rawtime);
timeinfo = localtime (&rawtime);
strftime(buffer,80,"%Y-%m-%d %H:%M:%S",timeinfo);
puts(buffer);
return 0;
}

void printFunction(String objectName) {
if(nameArray[0] != objectName) {
nameArray[0] = objectName;
cout << nameArray[0] << " ";
timeFound();
cout << flush;
}
}

Как указано в комментариях, это пример вывода C ++ (из строки Aug 17.... в opengl support available печатаются только при запуске программы и больше не печатаются.

Aug 17, 2015 11:57:03 AM com.layers.Main main
INFO: Logger Created.
Please enter activity number:
1.1
VIDIOC_QUERYMENU: Invalid argument
VIDIOC_QUERYMENU: Invalid argument
VIDIOC_QUERYMENU: Invalid argument
VIDIOC_QUERYMENU: Invalid argument
VIDIOC_QUERYMENU: Invalid argument
VIDIOC_QUERYMENU: Invalid argument
VIDIOC_QUERYMENU: Invalid argument
VIDIOC_QUERYMENU: Invalid argument
VIDIOC_QUERYMENU: Invalid argument
VIDIOC_QUERYMENU: Invalid argument
VIDIOC_QUERYMENU: Invalid argument
VIDIOC_QUERYMENU: Invalid argument
VIDIOC_QUERYMENU: Invalid argument
VIDIOC_QUERYMENU: Invalid argument
init done
opengl support available
tap 2015-08-17 11:57:07
kitchenDoor 2015-08-17 12:57:07
fridge 2015-08-17 13:57:07

Также, если я закомментирую строку, начинающуюся до конца области:

String regEx...
...
}

Программа Java выводит на терминал, как и ожидалось, но мне пришлось закомментировать загрузку базы данных, чтобы проверить это, поэтому я не могу проверить, работает ли загрузка.

0

Решение

Я думаю, что ваша программа заблокирована в нечто, не связанное с каналом. Скорее всего база данных. В среде IDE может быть задан параметр classpath и / или VM, который отличается от того, что вы вводите в терминале.

Получите точную командную строку, запускаемую IDE, если вы не знаете, как это сделать с вашей IDE, вы можете сделать это с помощью jps и / proc // cmdline.

например. если я запускаю jps во время работы моей программы в IDE, я вижу:

13923 Jps
11333 MyJFrame
15006 Main

Я знаю, что мой основной класс — MyJFrame, поэтому я знаю, что мой PID должен быть 11333.

Если я запускаю cat / proc / 11333 / cmdline, я получаю:

/usr/local/jdk1.8.0_25/bin/java-Dfile.encoding=UTF-8-classpath/home/shackle/NetBeansProjects/JavaApplication31/build/classesjavaapplication31.MyJFrame

Он пропускает пробелы между аргументами, но совершенно очевидно, куда они пойдут. Выполните эту команду после осторожного ввода пробелов в терминале.

Кроме того, было бы неплохо увидеть, какая именно строка выполняется, когда вы запускаете jar, и она не выдает никаких результатов. Запустите исходную команду, используйте jps для получения pid, используйте jstack для этого pid, чтобы получить все кадры стека, включая строку, на которой он заблокирован.

0

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

Я решил исправить это, удалив конфигурацию jar по умолчанию и повторно добавив ее, приведенные ниже инструкции для всех, кто использует IntelliJ IDEA.

File -> Project Structure -> Artifacts

Затем удалите настройки банки, используя маленький minus кнопку и добавьте заново, используя plus условное обозначение.

JAR -> From modules with dependencies -> OK
0