Trả lời câu hỏi Ross Studtman trong những nhận xét ở trên (mà còn liên quan đến OP):
BufferedReader reader = new BufferedReader(new InputStreamReader(new BufferedInputSream(inputStream), "UTF-8"));
Các BufferedInputStream
là không cần thiết (và có thể gây hại hiệu quả do sao chép không liên quan). Điều này là do các ký tự BufferedReader
yêu cầu các ký tự từ InputStreamReader
trong các khối lớn bằng cách gọi InputStreamReader.read(char[], int, int)
, lần lượt (thông qua StreamDecoder
) gọi InputStream.read(byte[], int, int)
để đọc một khối byte lớn từ số InputStream
cơ bản.
Bạn có thể thuyết phục bản thân rằng đây là quá bằng cách chạy đoạn mã sau:
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
Bạn sẽ thấy kết quả như sau:
InputStreamReader.read(..., 0, 8192)
ByteArrayInputStream.read(..., 0, 8192)
Điều đó chứng tỏ các BufferedReader
yêu cầu một mảng lớn của nhân vật từ InputStreamReader
, do đó yêu cầu một đoạn lớn byte từ bên dưới InputStream
.
Nếu InputStream cơ bản là một FileInputStream, hai người đọc có thực hiện các lượng đĩa khác nhau đọc trong suốt toàn bộ quá trình đọc không? – bdkosher
Tôi đã kiểm tra nó bằng cách sử dụng perfmon, tôi không thấy sự khác biệt đáng chú ý.Tôi sẽ sớm cập nhật câu trả lời để bao gồm đoạn mã điểm chuẩn. – BalusC
Giống như tên gói :) –