2013-04-13 19 views

risposta

149

Java ha due tipi di classi per l'input e output (I/O): flussi e lettori/scrittori.

I flussi (InputStream, OutputStream e tutto ciò che li estende) sono per la lettura e la scrittura di dati binari da file, dalla rete o da qualsiasi altro dispositivo.

Lettori e scrittori sono per la lettura e la scrittura di testo (caratteri). Si tratta di un livello sopra i flussi, che converte i dati binari (byte) in caratteri e viceversa, utilizzando uno character encoding.

La lettura dei dati dal disco byte per byte è molto inefficiente. Un modo per velocizzarlo è usare un buffer: invece di leggere un byte alla volta, si leggono alcune migliaia di byte alla volta e li si mette in un buffer, in memoria. Quindi è possibile esaminare i byte nel buffer uno per uno.

Il tutorial Java di Oracle about I/O lo spiega in dettaglio.

Guardando la riga di codice che hai fornito:

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

System.in è un InputStream. Si crea un InputStreamReader che legge i byte da System.in. Quindi lo avvolgi in un BufferedReader.

Quindi, alla fine, si ha un BufferedReader che legge da un InputStreamReader che legge da System.in.

+2

Ben spiegato! – NINCOMPOOP

+1

Grazie per la tua risposta, ma ho una confusione. Come hai detto, abbiamo letto poche migliaia di byte contemporaneamente e li abbiamo messi nel buffer, quindi questo significa che il buffer è solo un posto nella memoria in cui stiamo memorizzando le cose? – user122345656

+2

@Jesper. Hai detto "Un modo per accelerare è utilizzare un buffer: invece di leggere un byte alla volta, leggi qualche migliaio di byte in una volta e li metti in un buffer, in memoria. Quindi puoi guardare i byte nel buffer uno per uno. " Sì, è vero, ma penso che anche con buffer, un singolo byte viene letto alla volta. L'unica differenza penso sia messa nel buffer e il programma quindi la legge dal buffer invece del disco –

3

Un flusso è la connessione e le informazioni effettive passate tra i punti. Il buffer è un contenitore di archiviazione che memorizza parte o tutti i dati in streaming e li invia al dispositivo di output.

Naturalmente, il punto è che se il flusso rallenta oltre la velocità di trasmissione dati richiesta per mostrare i dati, allora l'uscita si fermerebbe. Il buffer impedisce questo.

+0

Grazie per ans.Ma una domanda che mi è venuta in mente è cosa intendi per dati in streaming? Plz lo elabora. – user122345656

+1

Ci scusiamo per la risposta tardiva. Se immagini un semplice esempio di un file da 10 Mb sul server. Il server ha il file completo, ma non può inviare l'intero file in un pacchetto. Invece, il file è diviso in un numero finito di blocchi. Ogni blocco viene quindi inviato al computer remoto e riassemblato. Per lo streaming di dati in tempo reale vale la stessa teoria. Ma il server prende i dati in tempo reale e li invia come 'stream' di pacchetti. Il computer remoto memorizza quindi ogni pacchetto in un buffer. Il computer remoto legge i dati dal proprio buffer e crea un video da questo. Spero che questo aiuti! – PGallagher

13

Bene è una domanda in mente everbodys che inizia a lavorare sul pacchetto java.io. InputStreamReader e BufferedReader rappresentano solo gli oggetti java (non c'è nulla di speciale su di essi) ma sono creati per operazioni io come leggere e scrivere da/a diversi input/output come file, oggetto ecc.

Ora lascia venire allineare

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

InputStreamReader è la classe di leggere il flusso di input di byte.Ma leggere ogni byte è un'operazione costosa quindi lo stiamo avvolgendo attorno a BufferedReader per farlo bufferare (che è il pattern decoratore)

Quindi, cosa succederà anche prima di iniziare a leggere, bufferedReader memorizzerà alcuni blocchi di byte nel registro e quando si esegue un'operazione di lettura. esso verrà letto da quella posizione che è molto meno costoso di lettura da console/file, ma in caso di InputStreamReader, quando si esegue l'operazione di lettura ogni volta che un'operazione di accesso al disco avviene

+1

Grazie. Ora le cose stanno diventando chiare !! – user122345656

+0

+1 ma preferirei se avesse aggiunto il riferimento ai collegamenti per il decoratore di informazioni e ogni volta che l'operazione di accesso al disco ha luogo le sentenze – shareef

+0

L'ultimo paragrafo riassume bene i benefici. Grazie per questo. –

4

Streams: Flussi sono flussi di dati che può leggere o scrivere gli stream sono in genere connessi a un'origine dati o dati, come un file, una connessione di rete, ecc.

Buffer: un contenitore per dati di un tipo specifico primitivo. Un buffer è una sequenza lineare e finita di elementi di uno specifico tipo primitivo. Oltre al suo contenuto, le proprietà essenziali di un buffer sono la sua capacità, limite, e la posizione:

4

Tampone:

È una regione di una memoria fisica utilizzata per memorizzare temporaneamente i dati mentre viene spostato da un luogo all'altro. Quella memoria di memoria fisica sarebbe RAM (memoria ad accesso casuale) nella maggior parte dei casi.

Ma dal contesto di questa domanda, Buffer viene utilizzato durante la lettura/scrittura di dati. Non è necessario utilizzarlo mentre si spostano i dati da un luogo a un altro.

Esempio per il buffer: Se il sistema ha 4 GB di RAM, 4 KB di memoria (RAM) può essere assegnato per Buffer dal sistema. KB - Kilobyte (s), GB - Gigabyte (s)

I/O Stream (o) Stream:

I/O stream rappresenta una sorgente di ingresso o una destinazione di uscita. Uno stream può rappresentare molti diversi tipi di origini e destinazioni, compresi file su disco, dispositivi, altri programmi e array di memoria.

I/O significa Input/Output.

Quindi, flusso di input può essere una sorgente di ingresso come file su disco, connessione di rete, ecc

E, uscita stream può essere una destinazione di uscita come file su disco, connessione di rete, ecc

Secondo lo JAVA official documentation, gli stream sono di 3 tipi.

  1. Byte Streams (lettura o scrittura Byte)
  2. Character Streams (leggere o scrivere caratteri)
  3. Buffered Streams (leggere, o scrivere, Buffer per l'efficienza)

Byte Streams:

Eseguono input e output di byte da 8 bit. Tutte le classi di stream di byte discendono da InputStream e OutputStream.

Byte Le classi di flusso di input ottengono input come byte grezzi. Le classi di flusso di uscita byte forniscono l'output come byte grezzi.

InputStream - diretti sottoclassi noti

AudioInputStream, ByteArrayInputStream, FileInputStream, FilterInputStream, InputStream, ObjectInputStream, PipedInputStream, SequenceInputStream, StringBufferInputStream. 

OutputStream - diretti Sottoclassi noti

ByteArrayOutputStream, FileOutputStream, FilterOutputStream, ObjectOutputStream, OutputStream, PipedOutputStream 

Carattere Streams: Sono uno strato sulla parte superiore del Byte Streams. Trasformano i byte (dati binari) in caratteri e caratteri in byte, usando una codifica di caratteri.

Tutte le classi stream carattere discendono da Reader e Writer.

Reader - diretta Conosciuto sottoclassi

BufferedReader, CharArrayReader, FilterReader, InputStreamReader, PipedReader, StringReader 

Writer - diretto conosciuto sottoclassi

BufferedWriter, CharArrayWriter, FilterWriter, OutputStreamWriter, PipedWriter, PrintWriter, StringWriter 

Byte Streams & carattere Streams uso senza buffer di I/O.

Ciò significa che ogni richiesta di lettura o scrittura viene gestita dal direttamente dal sistema operativo sottostante. Ciò può rendere un programma molto meno efficiente , dal momento che ciascuna di tali richieste spesso attiva l'accesso al disco, l'attività di rete o altre operazioni relativamente costose. Per ridurre questo tipo di sovraccarico, la piattaforma Java implementa i flussi di I/O bufferizzati .

Buffered Streams:

ingresso Buffered flussi dati letti da un'area di memoria noto come tampone; l'API di input nativa viene chiamata solo quando il buffer è vuoto.

Analogamente, i flussi di output bufferizzati scrivono dati su un buffer e l'API di output nativo viene chiamata solo quando il buffer è pieno.

Un programma può convertire un buffer flusso in un tamponata flusso utilizzando il linguaggio di incarto, in cui l'oggetto flusso buffer viene passato al costruttore per una classe di flusso tamponata.

Esempio:

inputStream = new BufferedReader(new FileReader("xanadu.txt")); 
outputStream = new BufferedWriter(new FileWriter("characteroutput.txt")); 

Ci sono 4 classi stream tamponate che vengono utilizzati per avvolgere i flussi senza buffer:

per creare tamponataByte Streams uso, BufferedInputStream e BufferedOutputStream classi.

Per creare tamponataPersonaggio Corsi d'acqua uso, BufferedReader e BufferedWriter classi.

Problemi correlati