Могу ли я предположить, что -1 возвращается только тогда, когда поток закрыт?
Да.
Вы не должны предполагать, что такие вещи . Вы должны прочитать javadoc и реализовать в соответствии с тем, как API работает. Особенно, если вы хотите, чтобы ваш код был надежным (или «безопасным», как вы его выразили).
Сказав это, это является более или менее тем, что в данном случае говорит Javadoc. (Можно придумать, что EOF и «поток был закрыт» не обязательно означают одно и то же ... и что закрытие потока путем вызова InputStream.close()
или Socket.close()
локально будет иметь другой эффект Однако ни один из них не имеет прямого отношения к вашему варианту использования.)
Нет ли способа воссоздать исключение ввода-вывода, которое возникает при принудительном разрыве соединения?
Нет. Для начала, обычно не создается исключение, поэтому «воссоздать» обычно нечего. Во-вторых, информация в исходном исключении (если когда-либо было) исчезла.
Должен ли я отправить пакет, который сообщит моему InputStream, что он должен закрыться вместо двух предыдущих методов?
Нет. Лучший способ - проверить результат вызова read
. В любом случае вам необходимо проверить его, поскольку вы не можете предполагать, что метод read(byte[])
(или любой другой) вернет количество байтов, которое вы фактически запросили.
Полагаю, что при определенных обстоятельствах было бы нормально создать исключение для приложения .
Но помните общий принцип, что исключения не должны использоваться для нормального управления потоком.
Один из других ответов предлагает создать прокси InputStream, который выдает какое-то исключение вместо возврата -1.
ИМО, это плохая идея. В итоге вы получаете прокси-класс, который утверждает, что является InputStream
, но нарушает контракт методов read
. Это может привести к проблемам, если прокси-сервер будет передан для чего-то, что ожидало правильно реализованного InputStream
.
Во-вторых, InputStream
- это abstract class
, а не interface
, поэтому механизм динамического прокси в Java не будет работать. (Например, метод newProxyInstance
требует список интерфейсов, а не классов.)