In risposta alla domanda di Ross Studtman nel commento di cui sopra (ma rilevanti anche per il PO):
BufferedReader reader = new BufferedReader(new InputStreamReader(new BufferedInputSream(inputStream), "UTF-8"));
Il BufferedInputStream
è superfluo (e probabilmente danneggia le prestazioni a causa di copie estranee). Questo perché BufferedReader
richiede caratteri dallo InputStreamReader
in blocchi di grandi dimensioni chiamando InputStreamReader.read(char[], int, int)
, che a sua volta (tramite StreamDecoder
) chiama InputStream.read(byte[], int, int)
per leggere un grande blocco di byte dal sottostante InputStream
.
ci si può convincere che questo è così eseguendo il seguente codice:
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
si vedrà il seguente output:
InputStreamReader.read(..., 0, 8192)
ByteArrayInputStream.read(..., 0, 8192)
Ciò dimostra che i BufferedReader
richieste un grande pezzo di caratteri da InputStreamReader
, che a sua volta richiede una grande quantità di byte dal sottostante InputStream
.
Se l'InputStream sottostante era un FileInputStream, i due Lettori eseguivano quantità diverse di letture del disco durante l'intero processo di lettura? – bdkosher
L'ho controllato usando perfmon, non vedo differenze evidenti.Aggiornerò presto la risposta per includere uno snippet di codice di riferimento. – BalusC
Grande come per il nome del pacchetto :) –