В ответ на вопрос Росса Студтмана в комментарии выше (но также относящийся к ФП):
BufferedReader reader = new BufferedReader(new InputStreamReader(new BufferedInputSream(inputStream), "UTF-8"));
BufferedInputStream
является лишним (и, вероятно, вредит производительности из-за постороннего копирования). Это связано с тем, что BufferedReader
запрашивает символы из InputStreamReader
большими кусками, вызывая InputStreamReader.read(char[], int, int)
, который, в свою очередь (через StreamDecoder
), вызывает InputStream.read(byte[], int, int)
для чтения большого блока байтов из базового InputStream
.
Вы можете убедиться в этом, запустив следующий код:
new BufferedReader(new InputStreamReader(new ByteArrayInputStream("Hello world!".getBytes("UTF-8")) {
@Override
public synchronized int read() {
System.err.println("ByteArrayInputStream.read()");
return super.read();
}
@Override
public synchronized int read(byte[] b, int off, int len) {
System.err.println("ByteArrayInputStream.read(..., " + off + ", " + len + ')');
return super.read(b, off, len);
}
}, "UTF-8") {
@Override
public int read() throws IOException {
System.err.println("InputStreamReader.read()");
return super.read();
}
@Override
public int read(char[] cbuf, int offset, int length) throws IOException {
System.err.println("InputStreamReader.read(..., " + offset + ", " + length + ')');
return super.read(cbuf, offset, length);
}
}).read(); // read one character from the BufferedReader
Вы увидите следующий вывод:
InputStreamReader.read(..., 0, 8192)
ByteArrayInputStream.read(..., 0, 8192)
Это показывает, что BufferedReader
запрашивает большой кусок символов из InputStreamReader
, который, в свою очередь, запрашивает большой кусок байтов из базового InputStream
.