в чем разница между ClosedChannelException и -1 в функции чтения Java SocketChannel

#java #sockets #nio

Вопрос:

Я видел документ java, и в нем говорится следующее : Количество прочитанных байтов, возможно, равно нулю или -1, если канал достиг конца потока

Интересно, означает ли «-1», что соединение закрыто?

Если это так, то почему существует исключение с именем ClosedChannelException , которое оно выбрасывает?

В чем разница между этими двумя понятиями?

введите описание изображения здесь

Комментарии:

1. Нет, это означает, что если вы попытаетесь позвонить read() по каналу, который close() был отключен, вы получите исключение.

Ответ №1:

Исключения обычно используются в ситуациях, когда обычный поток приложения не может продолжаться и необходимо применить некоторую специальную обработку. Особенно исключения никогда не следует использовать для обработки потока управления для событий, которые ожидаются/обычно.

В вашей ситуации JavaDoc четко указывает, что -1 возвращается, если достигнут конец потока. Например, вы читаете файл изображения по потоку, и все байты изображения были прочитаны, а затем -1 возвращаются, чтобы уведомить ваш код о том, что больше никаких данных ожидать не следует. Это обычная ситуация и часть обычного процесса управления. С другой стороны ClosedChannelException , выбрасывается, если канал был (удаленно) закрыт до того, как были прочитаны все данные. Это неожиданно. Данные были прочитаны не полностью, и приложение не может работать в обычном режиме, так как в этом примере нет изображения для отображения.

Еще одной причиной — помимо смешивания ожидаемых и неожиданных потоков программ — отказа от использования исключений для потока управления в ожидаемых ситуациях является производительность. В Java исключения являются дорогостоящей вещью. Исключением является довольно большой объект, и сбор текущей трассировки стека занимает значительное количество времени.

Комментарии:

1. Спасибо за ответ. И мне интересно, что будет возвращено, если соединение будет закрыто после того, как все данные будут прочитаны? Будет ли это просто еще одно исключение?

2. Я лично ожидал бы, что, если -1 он будет возвращен, канал продолжит возвращаться -1 . Но это только мое предположение. Вы могли бы взглянуть на реализацию SocketChannel , чтобы понять, что происходит.