Qual è la differenza tra Reader e InputStream?


87

Qual è la differenza tra Reader e InputStream? E quando usare cosa? Se posso usare Reader per leggere i caratteri, perché userò inputstream, immagino di leggere oggetti?


3
Per quanto riguarda "Immagino di leggere oggetti?", Esistono flussi di input / output speciali per la lettura / scrittura di oggetti Java. Sono rispettivamente ObjectInputStream e ObjectOutputStream e fanno parte del framework di serializzazione più ampio. java.sun.com/developer/technicalArticles/Programming/… Ma questo è solo un uso dei flussi di input / output, altri potrebbero inviare dati su un socket, ecc.
Mark Peters

Risposte:


138

Un InputStream è il metodo grezzo per ottenere informazioni da una risorsa. Cattura i dati byte per byte senza eseguire alcun tipo di traduzione. Se stai leggendo dati di immagine o qualsiasi file binario, questo è il flusso da usare.

Un lettore è progettato per i flussi di personaggi. Se le informazioni che stai leggendo sono tutte testo, allora il Reader si prenderà cura della decodifica dei caratteri per te e ti fornirà caratteri Unicode dal flusso di input non elaborato. Se stai leggendo qualsiasi tipo di testo, questo è lo stream da usare.

È possibile avvolgere un InputStream e trasformarlo in un Reader utilizzando la classe InputStreamReader.

Reader reader = new InputStreamReader(inputStream, StandardCharsets.UTF_8);

risposta impeccabile Berin! Grazie!
Gaurav

18

InputStream vengono utilizzati per leggere i byte da un flusso. Quindi sono utili per dati binari come immagini, video e oggetti serializzati.

I lettori d'altra parte sono flussi di caratteri, quindi sono utilizzati al meglio per leggere i dati dei caratteri.


Quando utilizzare read()byte per byte e quando utilizzare read(byte[])array di byte. Poiché penso che la lettura dell'array sia sempre migliore. allora puoi darmi un esempio dove usare read()byte per byte O read(byte[])array di byte. O. BufferedInputStream?
Asif Mushtaq

11

Immagino che la fonte di confusione sia che InputStream.read()restituisce an inte Reader.read()restituisce anche an int.

La differenza è che InputStream.read()restituiscono valori di byte compresi tra 0 e 255 corrispondenti al contenuto grezzo del flusso di byte e Reader.read()restituiscono il valore del carattere che è compreso tra 0 e 65357 (perché ci sono 65358 punti di codice unicode diversi)

Un InputStreamconsente di leggere il contenuto byte per byte, per esempio i contenuti "un ‡ una" vengono letti come un flusso di byte 5 (ciascuno rappresentato come inttra 0 e 255) con conseguente 97, 226, 128, 161e 97dove

a -> U+0061 -> 0x61 (hex) -> 97 (dec)
‡ -> U+2021 -> 0xE280A1 (utf-8 encoding of 0x2021) -> 226 128 161 (1 int per byte)
a -> U+0061 -> 0x61 (hex) -> 97 (dec)

Un Readerconsente di leggere il carattere contenuti per carattere in modo che i contenuti "un ‡ una" vengono letti come 3 caratteri 97, 8225e 97dove

a -> U+0061 -> 0x61 -> 97
‡ -> U+2021 -> 0x2021 -> 8225 (single int, not 3)
a -> U+0061 -> 0x61 -> 97

Il carattere ‡ viene indicato come U + 2021 in Unicode


Questa dovrebbe essere la risposta accettata. Grazie per l'esempio
alegria

2

Sfondo di InputStream e lettore:

Agli albori di java, l'unico modo per eseguire l'input della console era utilizzare un flusso di byte (InputStream e OutputStream).

Casi d'uso:

Oggi è accettabile anche l'utilizzo di un flusso di byte per leggere il flusso della console. Tuttavia, per le applicazioni commerciali, il metodo preferito per leggere l'input della console consiste nell'utilizzare il flusso orientato ai caratteri (Reader). Reader semplifica l'internazionalizzazione e la manutenzione.

Nota: questa è solo un'informazione aggiuntiva per esplorare i codici I / O Java: il modello di progettazione dell'implementazione di I / O Java segue il modello di progettazione del decoratore. Se hai familiarità con il modello di progettazione del decoratore, puoi facilmente recuperare l'implementazione.



0

InputStream accetta byte , Reader accetta caratteri, In Java, un carattere = due byte e Reader usa buffer, InputStream non usa. Tutti i file vengono archiviati su disco o trasferiti in base al byte, includono immagini e video, ma il carattere è in memoria, quindi InputStream viene utilizzato frequentemente.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.