2010-07-07 7 views
45

Qual è il vantaggio dell'utilizzo di InputStream su InputStreamReader o viceversa.InputStream vs InputStreamReader

Ecco un esempio di InputStream in azione:

InputStream input = new FileInputStream("c:\\data\\input-text.txt"); 

int data = input.read(); 
while(data != -1) { 
    //do something with data... 
    doSomethingWithData(data); 

    data = input.read(); 
} 
input.close(); 

Ed ecco un esempio di utilizzo InputStreamReader (ovviamente con l'aiuto di InputStream):

InputStream inputStream = new FileInputStream("c:\\data\\input.txt"); 
Reader  reader  = new InputStreamReader(inputStream); 

int data = reader.read(); 
while(data != -1){ 
    char theChar = (char) data; 
    data = reader.read(); 
} 

reader.close(); 

fa il processo di Reader i dati in un modo speciale?

Sto solo cercando di capire l'aspetto dei dati di streaming di i/o in Java.

+2

Nota è generalmente una buona idea per specificare una codifica dei set di caratteri quando si costruisce un 'InputStreamReader'. Se lo lasci fuori, allora prenderà in considerazione qualsiasi codifica che viene configurata nel modo giusto (se è quello che vuoi, allora scrivilo esplicitamente). –

risposta

73

Essi rappresentano le cose un po 'diverse.

Il InputStream è la classe antenato di tutti i possibili torrenti di byte, non è utile per sé, ma tutte le sottoclassi (come la FileInputStream che si sta utilizzando) sono grandi a che fare con dati binari.

Sulla controparte il InputStreamReader (e il suo padre Reader) sono utilizzati appositamente per affrontare caratteri (stringhe) in modo in modo da gestire codifiche charset (utf8, iso-8859-1, e così via) con grazia.

La risposta è semplice: se avete bisogno di dati binari è possibile utilizzare un InputStream (pure preciso come un DataInputStream), se avete bisogno di lavorare con il testo utilizzare un InputStreamReader ..

5

Se si desidera leggere dati binari, utilizzare InputStream.

Se si desidera leggere le stringhe da un flusso binario, utilizzare InputStreamReader. Uno dei suoi costruttori ti permette di specificare un set di caratteri.

Per questo motivo non utilizzare FileReader poiché utilizza un valore predefinito di piattaforma per un set di caratteri, che in molti casi non è pratico.

26

Il pozzetto InputStreamReader viene utilizzato per leggere direttamente i caratteri.

Quindi leggerli come int e quindi convertirli in char non è davvero ottimale.

Questa è la differenza principale, credo.

InputStream fornisce i byte e InputStreamReader fornisce già i caratteri in modo da leggere8 bit alla volta.

Inoltre, se stai leggendo grandi blocchi di testo, si può anche avvolgere il InputStreamReader in una BufferedReader che fornisce alcuni metodi di belle diciamo intere linee leggere in una sola volta.

Questo ti aiuta?

È inoltre possibile leggere questo articolo: https://docs.oracle.com/javase/tutorial/essential/io/charstreams.html

Cheers,

+0

Sì, ha senso. C'è un modo per specificare un buffer, in modo che legga più di 1 byte alla volta - diciamo ad esempio che volevo che leggesse 1024 byte alla volta. – xil3

+0

Ciao, Bene, se si utilizza BufferedReader è possibile definire la dimensione del buffer come da Javadoc "BufferedReader (Reader in, int sz)". Tuttavia, per un InputStreamReader credo che sia pronto solo 1 byte alla volta. Non puoi cambiarlo. – Trefex

+0

OK, grazie :) – xil3

9

Da InputStreamReader javadoc:

Una classe per trasformare un flusso di byte in un flusso di caratteri. I dati letti dal flusso di input di origine vengono convertiti in caratteri tramite un convertitore di caratteri fornito di default o con un valore di . La codifica predefinita viene presa dalla proprietà di sistema "file.encoding" . {@code InputStreamReader} contiene un buffer di byte letti dallo stream di origine e li converte in caratteri, se necessario.

Per InputStreams, che contiene effettivamente caratteri in una codifica conosciuta, utilizzare il lettore. Altrimenti ottieni solo i byte e dovrai eseguire la conversione in char 'a mano'.

La differenza tra i due metodi read:

InputStream::read legge una singola byte e restituisce come un int mentre InputStreamReader::read legge una singola char (rispettando la codifica) e restituisce questo come int.

1

InputstreamReader viene utilizzato per leggere i dati Unicode che non è possibile leggere in inputstream.

1

InputStream ci aiuta a leggere byte flussi
mentreInputStreamReader aiuta decodificare quei byte flussi in flussi char utilizzando alcuni set di caratteri come UTF-8 o altri.
Ma per una maggiore efficienza Java API raccomanda di utilizzare BufferedReader anche con InputStream e InputStreamReader

Problemi correlati