2011-09-11 9 views
29

Qual è la differenza tra le classi Java BufferedReader e InputStreamReader?Qual è la differenza tra le classi Java di BufferedReader e InputStreamReader?

+0

Anche Tell Abt DataInputStream Class –

+2

@ amod0017 la risposta alla domanda è completa in Javadoc. Chiedere domande sui forum che hanno risposte ben specificate nella documentazione del prodotto deve essere scoraggiato come una pessima abitudine. Spreca solo tempo prezioso. La risposta corretta è già presente in Javadoc e qualsiasi risposta qui verrà citata letteralmente, che l'OP potrebbe aver già letto, o parafrasa che è una perdita di valore e precisione. E facendo una domanda che potresti rispondere a te stesso su un forum, e aspettare possibilmente per sempre, per una risposta probabilmente errata. non è una strategia di apprendimento razionale. – EJP

+2

@EJB sono d'accordo, ma credo che la domanda che viene posta sia presentata in modo sbagliato ... ha qualche input particolare su alcune applicazioni web e vuole solo chiedere quale preferire ... come è confuso tra i due ... semplicemente così. – amod

risposta

32

BufferedReader è un wrapper per "InputStreamReader/FileReader", che bufferizza le informazioni ogni volta che viene chiamato un I/O nativo.

Si può immaginare la differenza di efficienza con la lettura di un carattere (o byte) rispetto alla lettura di un grande no. di caratteri in un colpo solo (o byte). Con BufferedReader, se si desidera leggere un singolo carattere, esso memorizzerà il contenuto per riempire il suo buffer (se è vuoto) e per ulteriori richieste, i caratteri verranno letti direttamente dal buffer, e quindi otterrà una maggiore efficienza.

InputStreamReader converte i flussi di byte in flussi di caratteri. Legge byte e li decodifica in caratteri usando un set di caratteri specificato. Il set che utilizza può essere specificato per nome o può essere fornito in modo esplicito oppure può essere accettato il set di caratteri predefinito della piattaforma.

Spero che aiuti.

+0

@ajay ... dimmi se sono necessari ulteriori dettagli .. ma sii specifico per il dubbio. – amod

+1

amod Voglio usare queste classi per archiviare il contenuto di una pagina Web. Voglio sapere se dovrei usare BufferedReader o InputStreamReader? –

+0

@ajay non sono molto sicuro di questo .. ma ho letto da qualche parte che BufferReader è efficiente. – amod

16

La classe InputStreamReader adatta digitare InputStream (byte non) alla classe Reader (bytes interpretati come caratteri in un insieme di caratteri), ma non si applica buffering aggiuntivo. La classe BufferedReader prende una classe Reader (presumibilmente unbuffered) e applica il buffering ad essa.

+2

"buffering" cosa significa? –

+6

Buffering significa che i dati vengono aggregati in un array chiamato "buffer".L'uso di un buffer rende le letture più efficienti in quanto copiate pezzi di grandi dimensioni dalla rete al buffer alla volta anche se leggete solo una piccola quantità dal buffer alla volta. Rende anche possibile rileggere il contenuto che è già stato consumato (tornando a una posizione precedente nel buffer che è ciò che "mark"/"reset" fa). –

+0

Quando usare 'read()' byte per byte e quando usare 'read (byte [])' array di byte. Penso che leggere array sia sempre meglio. allora puoi darmi un esempio dove usarne uno entrambi? – UnKnown

12

La lettura dalla memoria principale è più veloce della lettura da disco/STDIN.

BufferedReader utilizza una tecnica chiamata buffer che ci permette di ridurre la frequenza con leggiamo dal disco/STDIN copiando blocchi alla memoria principale.

consideri:

BufferedReader in = new InputStreamReader(System.in); 
in.read(); // 
in.read(); // 
// ... 
in.read(); // could be hitting the disk/STDIN a lot (slow!) 

vs:

BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); 
in.read(); // 
in.read(); // 
// ... 
in.read(); // hitting main memory a lot (fast!) 

Dal documentation:

Senza buffer, ogni chiamata di read() potrebbero causare byte da leggere dal [disc/STDIN], convertito in caratteri e quindi restituito, che può essere molto inefficiente.

Le due classi implementano la stessa interfaccia di Reader. Pertanto, mentre è possibile utilizzare solo InputStreamReader senza BufferedReader, il risultato potrebbe essere scarso rendimento. Stiamo usando il decorator pattern qui in modo che ci ritroviamo con uno InputStreamReader che ha ora una capacità di buffering.

0

Mi pare di capire che invece di InputStreamReader BufferedReader richiede meno tempo per convertire i dati dal byte da character.so preferiamo BufferedReader per migliorare le prestazioni

2

BufferedReader legge un paio di caratteri dal flusso specificato e lo memorizza in un buffer. Questo rende l'input più veloce.

InputStreamReader legge solo un carattere dal flusso specificato e i caratteri rimanenti rimangono nel flusso.

Esempio:

class NewClass{  
    public static void main(String args[]) throws IOException{ 

     BufferedReader isr = new BufferedReader(new InputStreamReader(System.in)); 

     Scanner sc = new Scanner(System.in); 

     System.out.println("B.R. - "+(char)isr.read()); 
     System.out.println("Scanner - " + sc.nextLine());  
    } 
} 

Quando viene eseguita l'istruzione isr.read(), sono entrato l'ingresso “ciao” e il carattere “h” di “ciao” è stampato sullo schermo. Se fosse InputStreamReader, i caratteri rimanenti "ello" sarebbero rimasti nel flusso System.in e sc.nextLine() li avrebbe stampati. Ma in questo caso non succede perché BufferedReader legge tutti i caratteri "ciao" dal flusso System.in e li memorizza nel proprio buffer personale e quindi il flusso System.in rimane vuoto quando sc.nextLine() è eseguito.

Per il codice:

class NewClass{  

    public static void main(String args[]) throws IOException{ 

     InputStreamReader isr = new InputStreamReader(System.in); 

     Scanner sc = new Scanner(System.in); 

     System.out.println("I.S.R. - "+(char)isr.read()); 
     System.out.println("Scanner - " + sc.nextLine()); 

    } 
} 

In questo caso InputStreamReader legge solo un carattere per “ciao” di ingresso e il restante “ello” rimangono nel flusso System.in e questi caratteri vengono stampati da sc. nextLine();

Conclusione:

BufferedReader legge un paio di caratteri (anche se vogliamo un solo carattere si leggerà di più) dal flusso di input e li memorizza in un buffer. Ecco perché è chiamato BufferedReader. Non ero in grado di capire quanti caratteri leggeva in una volta sola. Variava da 3 a 10 quando l'ho testato per questa risposta.

InputStreamReader legge un solo carattere dal flusso di input e i caratteri rimanenti rimangono nel flusso. Non c'è un buffer intermedio in questo caso.

Quando uno o più thread o oggetti desiderano leggere i caratteri da System.in, in questo caso deve essere utilizzato InputStreamReader perché legge solo un carattere e il rimanente può essere utilizzato da altri oggetti o thread.

BufferedReader è veloce perché mantiene un buffer e il recupero dei dati dal buffer è sempre rapido rispetto al recupero dei dati da disco/stdin.

Problemi correlati