Чтобы ответить на ваш главный вопрос: Нет, вы не можете go напрямую с InputStream
/ OutputStream
до BufferedReader
/ BufferedWriter
. Проблема в том, что вам нужен класс, который может переводить из потока ввода / вывода, который имеет дело непосредственно с байтами, в устройство чтения / записи, которое имеет дело с символами (то есть путем декодирования байтов в символы и наоборот). Как указывает @ jaco0646 ответ , это один из минусов шаблона декоратора. Конечно, вы можете сделать служебный метод:
public static BufferedReader toBufferedReader(InputStream stream, Charset charset) {
return new BufferedReader(new InputStreamReader(stream, charset));
}
, чтобы сделать ваш другой код короче. Хотя я уверен, что уже есть библиотека, которая обеспечивает это (например, может быть Commons IO или Guava ).
Это все, как говорится, вы не Похоже, нужен читатель или писатель. Ваш вопрос указывает, и вы позже подтверждаете в комментарии , что вы просто загружаете данные непосредственно в файл. Это означает, что вам не нужно декодировать байты в символы только для немедленного кодирования символов обратно в байты. Вам просто нужно перенести байты с InputStream
на OutputStream
напрямую. Вот несколько примеров (оставаясь в JDK):
Копирование байтов вручную с использованием буфера
public static void copyUrlToFile(URL url, File file) throws IOException {
try (InputStream input = url.openStream();
OutputStream output = new FileOutputStream(file)) {
byte[] buffer = new byte[1024 * 8]; // 8 KiB buffer
int read;
while ((read = input.read(buffer)) != -1) {
output.write(buffer, 0, read);
}
}
}
Можно также использовать Path
и Files#newOutputStream(Path,OpenOption...)
вместо File
и FileOutputStream
.
public static void copyUrlToFile(URL url, File file) throws IOException {
try (InputStream input = url.openStream();
OutputStream output = new FileOutputStream(file)) {
input.transferTo(output);
}
}
public static void copyUrlToFile(URL url, Path file) throws IOException {
try (InputStream input = url.openStream()) {
Files.copy(input, file, StandardCopyOption.REPLACE_EXISTING);
}
}
Обратите внимание, что при использовании NIO вы можете открывать буферизованные устройства чтения и записи для файлов, непосредственно используя Files#newBufferedReader(Path)
и Files#newBufferedWriter(Path,OpenOption...)
соответственно.