Я пытаюсь запустить процесс и делать что-то с его потоками ввода, вывода и ошибок. Очевидный способ сделать это — использовать что-то вроде select()
, но единственное, что я могу найти в Java, — это Selector.select()
, которое принимает Channel
. Похоже, невозможно получить Channel
из InputStream
или OutputStream
(у FileStream
есть метод getChannel()
, но он здесь не помогает)
Итак, вместо этого я написал код для опроса всех потоков:
while( !out_eof || !err_eof )
{
while( out_str.available() )
{
if( (bytes = out_str.read(buf)) != -1 )
{
// Do something with output stream
}
else
out_eof = true;
}
while( err_str.available() )
{
if( (bytes = err_str.read(buf)) != -1 )
{
// Do something with error stream
}
else
err_eof = true;
}
sleep(100);
}
который работает, за исключением того, что он никогда не заканчивается. Когда один из потоков достигает конца файла, available()
возвращает ноль, поэтому read()
не вызывается, и мы никогда не получаем возврат -1, который указывал бы на EOF.
Одним из решений может быть неблокирующий способ обнаружения EOF. Нигде в документах не вижу. В качестве альтернативы есть лучший способ сделать то, что я хочу сделать?
Я вижу этот вопрос здесь: текст ссылки, и хотя это не совсем то, что я хочу, я, вероятно, могу использовать эту идею создания отдельных потоков для каждого потока для конкретной проблемы, с которой я столкнулся сейчас. Но ведь это не единственный способ сделать это? Наверняка должен быть способ чтения из нескольких потоков без использования потока для каждого?