Java: Как проверить EOF на InputStream без блокировки? - PullRequest
4 голосов
/ 29 ноября 2011

Я хочу сделать что-то вроде этого:

// Implement an interruptible read
for(;;) {
  if (input.available() > 0)
    buffer.append(input.read());
  else if (input.eof())
    return buffer;
  else
    Thread.sleep(250);
}

Если бы я не заботился о блокировке, я бы сделал это:

for(;;) {
  c = input.read();
  if (c != -1)
    buffer.append(c);
  return buffer;
}

Но мне все равно, поэтому мне нужно использовать available (), так как я могу определить EOF?

Ответы [ 2 ]

4 голосов
/ 29 ноября 2011

Вместо этого вы всегда можете использовать библиотеку NIO, поскольку она обеспечивает неблокирующий ввод-вывод (как следует из названия). В блоге Oracle есть сообщение о IO против NIO: Здесь .

В качестве альтернативы есть несколько примеров кода Здесь о настройке параметров времени ожидания при чтении из InputStream

1 голос
/ 29 ноября 2011

Возможно, вас заинтересуют сокетные каналы, если вас интересует отсутствие блокировки.Каналы можно найти в пакете java.nio.В частности, вас может заинтересовать интерфейс ReadableByteChannel и классы, которые его реализуют.

Вы будете использовать каналы примерно так.

SocketChannel channel = SocketChannel.open(new InetSocketAddress("127.0.0.1",8000));

ByteBuffer buffer = ByteBuffer.allocate(1024);

while(channel.read(buffer) != -1) { 
// if -1 is returned then stream has been closed and loop should exit
    if (buffer.remaining() == 0) {
        // buffer is full, you might want to consume some of the data in buffer
        // or allocate a larger buffer before continuing
    }
    // we have now just read as much was available on the socket channel. Any
    // immediate  attempts to read from the channel again will result in the 
    // read method returning immediately.
    // Hence try to do something useful with the data before reading again
}

// channel is now closed
...