Java + Process

0

Mam taki problem:

Tworzę sobie proces za pomocą ProcessBuilder'a.
Proces ten to aplikacja konsolowa w C++ lub Python'ie. Chciałbym czytać wyjście standardowe na bieżąco (tzn brać i coś z takim tekstem robić).
Przy czym zaznaczę, iż nie jest to program start-stop, tylko działający w trybie ciągłym tzn na początku uruchamiam go poprzez:

	ProcessBuilder builder = new ProcessBuilder("path/executable");
	Process process = builder.start();

Mam problem jednak z określeniem, w którym miejscu zakończyło się wypisywanie wyjścia, tzn czasami zdarza się, że tekst który dostanę jest niekompletny, tzn:

Powiedzmy że dla "do something" wyjście powinno wyrzucać:
stdin: "do something"
stdout: "A B C D E"

Ale czasem wyrzuca:
stdin: "do something"
stdout: "A B C "

Miał ktoś może jakieś podobne problemy?
Próbowałem używać czegoś apache.commons.exec.DefaultExecutor ale ten z kolei określa proces za zakończony kiedy tylko stdout się odblokuje - tzn wyrzuci kompletne stdout, ale jak tylko zobaczy, że stdin jest odblokowane to zamyka cały proces.

0

Czegoś nie rozumiem. Dlaczego nie możesz czytać stdout procesu aż do jego zakończenia, tj. gdy dostaniesz -1 z read? Dokładnie tak samo jakbyś czytał każdy inny strumień.

0

Niemożliwe.

U mnie wyjście NIE jest zamykane, a więc jeżeli nie ma więcej znaków do odczytu i rzucę read to wątek jest blokowany.

Edit:
Ok, rozwiązałem.
Nieco średnie rozwiązanie z programistycznego punktu widzenia.
Wygląda to mniej więcej tak, że oprócz procesu mamy dodatkowy wątek ciągle czytający dane do bufora, a znaki z kolei wyjście.
Czytanie odbywa się za pomocą pętli, która kończy się gdy przez X (x - zmienna konfiguracyjna) czasu nie pojawi się w buforze żaden znak.

1 użytkowników online, w tym zalogowanych: 0, gości: 1