En respuesta a la pregunta de Ross Studtman en el comentario anterior (pero también es relevante para el OP):
BufferedReader reader = new BufferedReader(new InputStreamReader(new BufferedInputSream(inputStream), "UTF-8"));
El BufferedInputStream
es superfluo (y probablemente perjudica el rendimiento debido a la copia extraña). Esto se debe a la BufferedReader
pide personajes de la InputStreamReader
en grandes trozos llamando InputStreamReader.read(char[], int, int)
, que a su vez (a través de StreamDecoder
) llama InputStream.read(byte[], int, int)
para leer un gran bloque de bytes desde el InputStream
subyacente.
Puede convencerse de que esto es así ejecutando el siguiente código:
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
verá el siguiente resultado:
InputStreamReader.read(..., 0, 8192)
ByteArrayInputStream.read(..., 0, 8192)
Esto demuestra que los BufferedReader
peticiones de una gran parte de los personajes del InputStreamReader
, que a su vez solicita un gran fragmento de bytes del InputStream
subyacente.
Si el InputStream subyacente fuera un FileInputStream, ¿los dos lectores realizarían diferentes cantidades de lecturas de disco durante todo un proceso de lectura? – bdkosher
Lo revisé usando perfmon, no veo diferencias notables.Actualizaré la respuesta pronto para incluir un fragmento de código de referencia. – BalusC
Grande como para el nombre del paquete :) –