Domanda

1) Come funziona flussi tamponati lavorano in background, come si differenziano dai flussi normali e quali sono i vantaggi (s) di usarli?

2) DataInputStream è anche Byte based. Ma sta avendo metodi per readLine(). Qual è il punto qui?

È stato utile?

Soluzione

Dal javadoc BufferedInputStream:

  

A BufferedInputStream aggiunge funzionalità a un altro input del flusso, cioè, la capacità di buffer di ingresso e di sostenere il marchio e resettare metodi. Quando viene creato il BufferedInputStream, viene creato un array buffer interno. Come byte dal flusso vengono letti o ignorati, buffer interno è riempito se necessario, dal flusso di input contenuta, molti byte alla volta. L'operazione di contrassegno si ricorda di un punto nel flusso di input e l'operazione di ripristino fa sì che tutti i byte letti dal momento che la più recente operazione di marchio da rileggere prima di nuovi byte vengono presi dal flusso di input contenute.

Internamente una matrice tampone è usato invece di lettura byte singolarmente dal flusso di input sottostante abbastanza byte vengono letti per riempire il buffer. Ciò si traduce in genere in termini di prestazioni più veloci come meno letture sono tenuti sul flusso di input sottostante.

Il contrario è vero per poi BufferedOutputStream.

contrassegno () e reset () potrebbe essere utilizzata come segue:

1 BufferedInputStream bis = new BufferedInputStream(is);
2 byte[] b = new byte[4];
3 bis.read(b); // read 4 bytes into b
4 bis.mark(10); // mark the stream at the current position - we can read 10 bytes before the mark point becomes invalid
5 bis.read(b); // read another 4 bytes into b
6 bis.reset(); // resets the position in the stream back to when mark was called
7 bis.read(b); // re-read the same 4 bytes as line 5 into b

Per spiegare marchio / ripristinare un po 'di ...

Il BufferInputStream memorizza internamente la posizione corrente nel buffer. Mentre leggete byte la posizione verrà incrementato. Una chiamata a segnare (10) salverà la posizione corrente. Le chiamate successive per leggere continuerà a incrementare la posizione corrente, ma una chiamata a ripristinare imposterà la posizione corrente al suo valore quando marchio è stato chiamato.

L'argomento per marcare specifica quanti byte si può leggere dopo aver chiamato marchio prima della posizione del segno viene invalidata. Una volta che la posizione di marchio è invalidata non è più possibile chiamare reset per tornare ad essa.

Per esempio, se contrassegno (2) era stato usato in linea 4 di cui sopra un'IOException sarebbero gettati quando reset () viene chiamato sulla linea 6, come la posizione del segno sarebbe stato invalidato da quando abbiamo letto più di 2 byte.

Altri suggerimenti

Lettori Buffered / scrittori / InputStreams / OutputStreams lettura e scrittura per il sistema operativo in grossi pezzi per l'ottimizzazione. In caso di scrittori e outputstreams, i dati vengono accodati in memoria fino a quando c'è abbastanza raccolte di scrivere un grande pezzo. In caso di lettori e inputstreams, un grande pezzo viene letta forma di dischi / network / ... nel buffer e tutte le letture sono fatto da quel buffer fino a quando il buffer è vuoto, e un nuovo pezzo viene letto.

DataInputStream è infatti byte basa. Il metodo readLine è obsoleto. Internamente si legge byte dal disco / network / ... byte per byte fino a quando non ha raccolto una linea completa. Quindi questo flusso potrebbe essere accelerato utilizzando un BufferedInputStream come è sorgente, in modo che i byte della linea vengono letti dal buffer in memoria anziché direttamente dal disco.

Con un-buffered I / O ogni lettura o scrittura richiesta viene passata direttamente al sistema operativo. flussi I / O con buffer di Java leggere e scrivere dati al proprio buffer di memoria (di solito una matrice di byte). Le chiamate al sistema operativo sono fatte solo quando il buffer è vuoto (quando si fa legge) o il buffer è pieno (quando si fa scrittura). A volte è una buona idea per svuotare manualmente il buffer dopo punti critici nell'applicazione.

Dato che le chiamate API Operating System può causare accesso al disco, attività di rete e simili, questo può essere piuttosto costoso. Utilizzando i buffer a lotto il nativo del sistema operativo di I / O in blocchi più grandi spesso migliora significativamente le prestazioni.

flussi Buffered scrivere o leggere i dati in blocchi più grandi da - nomen est omen - buffer . A seconda del flusso sottostante, questo può aumentare notevolmente le prestazioni.

java.io.BufferedOutputStream s 'Javadocs:

  

Con la creazione di un tale flusso di uscita,   un'applicazione può scrivere bytes di   flusso di output sottostante senza   necessariamente provocando una chiamata al   sistema sottostante per ogni byte   scritta.

Per ridurre questo tipo di spese generali, la piattaforma Java implementa tamponato I / O flussi. inserimento bufferizzata flussi di dati letti da un'area di memoria noto come buffer; API ingresso nativo viene chiamato solo quando il buffer è vuoto. Allo stesso modo, flussi di uscita bufferizzati scrivere dati in un buffer, e l'API uscita nativo viene chiamato solo quando il buffer è pieno.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top