2011-01-09 19 views
19

Qual è il senso della dimensione del buffer nel costruttore?Qual è la dimensione del buffer in BufferedReader?

BufferedReader(Reader in, int size) 

Come ho scritto il programma:

import java.io.*; 
class bufferedReaderEx{ 
    public static void main(String args[]){ 
     InputStreamReader isr = null; 
     BufferedReader br = null; 
      try{ 
       isr = new InputStreamReader(System.in); 
//    System.out.println("Write data: "); 
//    int i = isr.read(); 
//    System.out.println("Data read is: " + i); 
       //Thus the InputStreamReader is useful for reading the character from the stream 
       System.out.println("Enter the data to be read by the bufferedReader: "); 
       //here isr is containing the lnefeed already so this is needed to be flushed. 
       br = new BufferedReader(isr, 2); 
       String str = br.readLine(); 
       System.out.println("The data is : :" + str); 
      }catch(IOException e){ 
       System.out.println("Can't read: " + e.getMessage()); 
      } 
    } 
} 

uscita:

Enter the data to be read by the bufferedReader: Hello world and hello world again 
The data is: Hello world and hello world again 

E allora che fa la dimensione del buffer significa come ho inteso che sarebbe essere la lettura solo due caratteri. ma non era quello.

risposta

29

BufferedReader buffer l'input, proprio come dice il nome. Ciò significa che legge dalla sorgente di input in un buffer prima di inviarlo a te. La dimensione del buffer qui si riferisce al numero di byte che buffer.

L'input di lettura proviene dalla maggior parte delle fonti è molto lento. Un buffer di soli 2 byte danneggerà le prestazioni, poiché molto probabilmente il tuo programma sarà in attesa di input per la maggior parte del tempo. Con una dimensione del buffer pari a 2, una lettura di 100 byte risulterà nella lettura di 2 byte dal buffer in memoria (molto veloce), riempiendo il buffer (molto lento), leggendo 2 byte dal buffer (molto veloce), riempiendo il buffer buffer (molto lento), ecc. - nel complesso molto lento. Con una dimensione del buffer di 100, una lettura di 100 byte risulterà nella lettura di 100 byte dal buffer in memoria (molto veloce) - nel complesso molto veloce. Ciò presuppone che il buffer contenga i 100 byte durante la lettura, il che in un caso come il vostro è un presupposto ragionevole da fare.

A meno che non si sappia cosa si sta facendo, è necessario utilizzare la dimensione del buffer di default che è abbastanza grande. Una ragione per un buffer più piccolo è quando si esegue un dispositivo a memoria limitata, poiché il buffer consuma memoria.

+0

quindi qual è il significato della dimensione del buffer. potresti spiegare per favore? – codeomnitrix

+1

@codeonnitrix Aggiunto un po 'di spiegazione. Fammi sapere se è sufficiente. – marcog

+0

grazie marcog .. – codeomnitrix

0

È la dimensione del buffer di input. Maggiori informazioni in javadoc.

+0

Ehi, questo l'ho già letto, in realtà voglio sapere che cosa è l'effetto di avere meno dimensioni del buffer o grandi dimensioni del buffer. Voglio dire qual è il suo significato. Voglio dire se la dimensione del buffer è 12000 o 200 che cosa dovrebbe essere usato quando il buffer – codeomnitrix

+1

con la dimensione 12000 utilizzerà più memoria ma funziona più rapidamente. Invece con 200 funzionerà più lentamente ma con un uso di memoria ridotto. * Più lento/più rapido a grandi dimensioni dei dati. –

+0

vuol dire che il lavoro verrà eseguito ogni volta, ma in passato un blocco da 20000 impiegherà due round mentre nell'altro lo stesso farà 100 round. è? – codeomnitrix

9

Quando si legge o scrive in un file, è necessario accedere al kernel, che in realtà ottiene l'accesso al file. Tutte le operazioni sui file devono passare attraverso il kernel. Questa è un'operazione abbastanza costosa. Il buffering causa la lettura di un blocco di byte; questi sono tenuti in una posizione temporanea nella RAM e vengono letti i byte da questa posizione. In questo modo, non stai facendo richieste frequenti al kernel di fare il file IO.

Se si utilizza un'enorme dimensione del buffer, si sfrutterà la RAM inutilmente. Se si utilizza un minuscolo, si verificheranno costantemente bug del kernel per le richieste di file. È meglio consentire l'utilizzo predefinito. È possibile specificare la dimensione del buffer e sperimentare. La maggior parte delle macchine legge un settore alla volta o un numero intero di settori. La dimensione del settore dipende da come si formatta la macchina.

Il seguente esperimento è interessante. Crea un file con 1.000.000 di zeri in esso. Usa la funzione di temporizzazione del tuo sistema operativo per vedere quanto velocemente lo copia su un altro file (scriverai un programma di copia con IO bufferizzato e non bufferizzato). Ora con varie dimensioni del buffer compreso il valore predefinito.

8

http://www.docjar.com/html/api/java/io/BufferedReader.java.html

Come da questa documentazione java, dimensione del buffer di default è la capacità di 8192 caratteri. La dimensione della linea è considerata come una capacità di 80 caratteri.

8192 la dimensione del buffer è sufficiente per file di dimensioni inferiori. Ma di nuovo questo è fattibile. se il file contiene più di 8192 caratteri, il metodo di riempimento di bufferedreader aumenterà la dimensione del buffer prima di leggere il contenuto dal file.Per file di contenuto più grandi impostare preferibilmente la dimensione massima per il buffer durante la creazione del lettore bufferizzato attraverso il costruttore, in modo da evitare di ricreare la memoria e copiare il vecchio array nell'array appena creato.

+0

Informazioni straight forward e [email protected] –

+0

Il buffer non cresce mai. È di dimensioni costanti. Viene utilizzato solo come memoria intermedia in memoria durante la lettura da un file. Sono pigro per spiegare di più, quindi guarda questo: https://stackoverflow.com/questions/648309/what-does-it-mean-by-buffer – gargii

Problemi correlati