java nio и конец потока для stdin, stdout, stderr

У меня есть программа A, которая получает стандартный вывод другой программы B в ByteBuffer через Pipe.SourceChannel.

Программа будет читать из ByteBuffer для stdout, пока не достигнет конца потока (то есть пока readte () ByteBuffer не вернет -1).

Может ли стандартный вывод программы B открываться и закрываться несколько раз при выполнении программы? То есть возможно ли, что read() возвращает -1, но более поздняя программа B имеет дополнительный стандартный вывод, и в этом случае программа A должна выполнить еще одно чтение () ByteBuffer?

Заранее спасибо.

2 ответа

Решение

В Linux вы можете использовать NIO для stdin, stdout и stderr, потому что они привязаны к определенным символьным устройствам, к которым можно обращаться как к файлам. Для этого вы можете открыть /proc/self/fd/0, 1 или же 2 соответственно. Это не работает для всех типов потоков или в не-Unix системах, но это может быть вариантом.

После того, как поток закрыт, его невозможно открыть, если только он не был файлом и вы не смогли получить имя файла.

Нет, это невозможно. stdout, stderr и stdin - это "специальные" потоки. Вы не можете закрыть их и открыть их позже.

Другие вопросы по тегам