针对上述评论中 Ross Studtman 的问题(但也与 OP 相关):
BufferedReader reader = new BufferedReader(new InputStreamReader(new BufferedInputSream(inputStream), "UTF-8"));
BufferedInputStream 是多余的(并且可能由于多余的复制而损害性能)。这是因为BufferedReader 通过调用InputStreamReader.read(char[], int, int) 以大块的形式从InputStreamReader 请求字符,而后者又(通过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 请求大量字符,而InputStreamReader 又向底层InputStream 请求大量字节。