Лично я нарушаю обычное правило «без побочных эффектов в состоянии» для такого рода вещей:
int bytesRead;
while ((bytesRead = in.read(buffer, 0, bufferSize)) != -1)
{
outStream.write(buffer, 0, bytesRead);
}
РЕДАКТИРОВАТЬ: Как уже отмечалось, действительно включает объявление read
вне цикла, но он вызывает read()
только один раз.Я никогда не считал, что это является проблемой - хотя я обычно предпочитаю объявлять переменные с настолько малой областью видимости, насколько это возможно, это более общая вещь, связанная с чистотой.Если вы хотите еще больше ограничить область действия, вы можете поместить все это в фигурные скобки или извлечь ее в свой собственный метод, такой как подход Алана.Вот как я бы это реализовал:
public static void copyStream(InputStream input, OutputStream output)
throws IOException {
byte[] buffer = new byte[1024 * 16]; // Reasonable general size
int bytesRead;
while ((bytesRead = in.read(buffer, 0, buffer.length)) != -1) {
outStream.write(buffer, 0, bytesRead);
}
}
В качестве альтернативы вы можете указать длину буфера в качестве параметра.Обратите внимание, что теперь это может быть включено в служебную библиотеку, и вам больше не нужно писать код.
В качестве альтернативы, вы можете использовать тот факт, что он уже доступен в других служебных библиотеках, таких как Guava как ByteStreams.copy