В этом случае я бы поступил так же, как вы (используйте байтовый массив для буферизации, а не один из потоковых буферов).
Хотя есть исключения. Единственное место, где вы видите буферы (на этот раз выводите), - это API сервлета. Данные не записываются в базовый поток до тех пор, пока не будет вызвана flush () , что позволит вам буферизовать вывод, но затем выгрузить буфер в случае возникновения ошибки и вместо этого записать страницу ошибки. Вы можете буферизовать ввод, если вам нужно сбросить поток для перечитывания, используя mark (int) и reset () . Например, может быть, вы захотите проверить заголовок файла, прежде чем принять решение о том, какой обработчик содержимого будет передавать поток.
Не имеет отношения, но я думаю, что вам следует переписать обработку вашего потока. Этот шаблон лучше всего работает, чтобы избежать утечек ресурсов:
InputStream stream = new FileInputStream("in");
try { //no operations between open stream and try block
//work
} finally { //do nothing but close this one stream in the finally
stream.close();
}
Если вы открываете несколько потоков, вложите блоки try / finally.
Еще одна вещь, которую ваш код делает, предполагает, что возвращаемый контент закодирован в наборе символов по умолчанию вашей виртуальной машины (хотя это может быть достаточно, в зависимости от варианта использования).