#java #sockets #nio
Вопрос:
Я видел документ java, и в нем говорится следующее : Количество прочитанных байтов, возможно, равно нулю или -1, если канал достиг конца потока
Интересно, означает ли «-1», что соединение закрыто?
Если это так, то почему существует исключение с именем ClosedChannelException
, которое оно выбрасывает?
В чем разница между этими двумя понятиями?
Комментарии:
1. Нет, это означает, что если вы попытаетесь позвонить
read()
по каналу, которыйclose()
был отключен, вы получите исключение.
Ответ №1:
Исключения обычно используются в ситуациях, когда обычный поток приложения не может продолжаться и необходимо применить некоторую специальную обработку. Особенно исключения никогда не следует использовать для обработки потока управления для событий, которые ожидаются/обычно.
В вашей ситуации JavaDoc четко указывает, что -1
возвращается, если достигнут конец потока. Например, вы читаете файл изображения по потоку, и все байты изображения были прочитаны, а затем -1
возвращаются, чтобы уведомить ваш код о том, что больше никаких данных ожидать не следует. Это обычная ситуация и часть обычного процесса управления. С другой стороны ClosedChannelException
, выбрасывается, если канал был (удаленно) закрыт до того, как были прочитаны все данные. Это неожиданно. Данные были прочитаны не полностью, и приложение не может работать в обычном режиме, так как в этом примере нет изображения для отображения.
Еще одной причиной — помимо смешивания ожидаемых и неожиданных потоков программ — отказа от использования исключений для потока управления в ожидаемых ситуациях является производительность. В Java исключения являются дорогостоящей вещью. Исключением является довольно большой объект, и сбор текущей трассировки стека занимает значительное количество времени.
Комментарии:
1. Спасибо за ответ. И мне интересно, что будет возвращено, если соединение будет закрыто после того, как все данные будут прочитаны? Будет ли это просто еще одно исключение?
2. Я лично ожидал бы, что, если
-1
он будет возвращен, канал продолжит возвращаться-1
. Но это только мое предположение. Вы могли бы взглянуть на реализациюSocketChannel
, чтобы понять, что происходит.