Есть такой код
AsynchronousSocketChannel channel;
.......
ByteBuffer buf = ByteBuffer.allocate(1000);
channel.read(buf, buf, CompletionHandler<Integer, ByteBuffer>() {
@Override
public void completed(Integer result, ByteBuffer attachment) {
if (result != -1)
System.out.println(attacment.hasRemaining());
}
@Override
public void failed(Throwable exc, ByteBuffer attachment) {
// process error
}
});
и аналогичный для записи
ByteBuffer buf = ByteBuffer.allocate(1000);
..........
buf.rewind();
channel.write(buf, buf, CompletionHandler<Integer, ByteBuffer>() {
@Override
public void completed(Integer result, ByteBuffer attachment) {
if (result != -1)
System.out.println(attacment.hasRemaining());
}
@Override
public void failed(Throwable exc, ByteBuffer attachment) {
// process error
}
});
Вопрос - всегда ли эти методы будут выводить false
или возможна ситуация когда прочитано/записано байт меньше, чем в буфере и операцию нужно будет повторить?
В случае метода read
вам может прийти данных больше, чем есть места в буфере buf
. В этом случае будет выведено true
и понадобится повторное чтение.
В случае метода write
, если ваш сервер генерирует поток данных достаточный, чтобы забить буферы отправки, может возникнуть ситуация, когда вы не сможете записать в канал содержимое buf
полностью. Тогда будет будет выведено true
и понадобится повторная запись.
Лучше всего писать код с учётом возможности неполной отправки и приёма данных.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Есть текст, в нем надо найти вопросительные, восклицательные и утвердительные предложенияПри это следует, каждое предложение добавить в коллекцию
Знаем, что forEach медленнее при работе с коллекциями, чем for (хотя может сейчас и это уже оптимизируется) Но накладывает ли приведение типов...
уважаемые разработчикиСтолкнулся с такой проблемой, точнее вопросом
Пытаюсь подключиться к БД Sqlite с помощью JDBC