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?
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?
Risposte:
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);
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.
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
?
Immagino che la fonte di confusione sia che InputStream.read()
restituisce an int
e 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 InputStream
consente di leggere il contenuto byte per byte, per esempio i contenuti "un ‡ una" vengono letti come un flusso di byte 5 (ciascuno rappresentato come int
tra 0 e 255) con conseguente 97
, 226
, 128
, 161
e 97
dove
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 Reader
consente di leggere il carattere contenuti per carattere in modo che i contenuti "un ‡ una" vengono letti come 3 caratteri 97
, 8225
e 97
dove
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
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.
Uno accetta byte e l'altro accetta caratteri.
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.