Обычно я предпочитаю использовать буфер фиксированного размера при чтении из входного потока.Как указал evilone, использование available () в качестве размера буфера может быть не очень хорошей идеей, потому что, скажем, если вы читаете удаленный ресурс, вы можете заранее не знать доступные байты.Вы можете прочитать javadoc InputStream , чтобы получить больше информации.
Вот фрагмент кода, который я обычно использую для чтения входного потока:
byte[] buffer = new byte[BUFFER_SIZE];
int bytesRead = 0;
while ((bytesRead = in.read(buffer)) >= 0){
for (int i = 0; i < bytesRead; i++){
//Do whatever you need with the bytes here
}
}
Используемая здесь версия read () заполнит данный буфер настолько, насколько это возможно, и вернетколичество байтов фактически прочитано.Это означает, что есть вероятность, что ваш буфер может содержать конечные данные мусора, поэтому очень важно использовать байты только до bytesRead
.
Обратите внимание на строку (bytesRead = in.read(buffer)) >= 0
, , в которой ничего нетСпецификация InputStream гласит, что read () не может читать 0 байтов. Возможно, вам потребуется обработать случай, когда read () читает 0 байтов как особый случай, в зависимости от вашего случая.Для локального файла я никогда не сталкивался с таким случаем;однако, когда я читал удаленные ресурсы, я на самом деле видел, что read () читает 0 байтов, постоянно приводя приведенный выше код в бесконечный цикл.Я решил проблему с бесконечным циклом, подсчитав количество раз, которое я прочитал 0 байтов, когда счетчик превысит пороговое значение, я сгенерирую исключение.Вы можете не столкнуться с этой проблемой, но просто имейте это в виду:)
Возможно, я не буду создавать новый байтовый массив для каждого чтения из соображений производительности.