Java, come molti linguaggi moderniprogrammazione, supporta l'implementazione di flussi di input di dati. In Java, InputStream è la classe base per i flussi di byte. Questa classe è astratta, cioè, mentre il programma è in esecuzione, non possiamo crearne un'istanza. Tuttavia, il pacchetto io contiene molte classi che ereditano ed estendono la funzionalità di InputStream. Per usare questa classe nel tuo codice, devi importarla dal pacchetto java.io.InputStream. Successivamente, esamineremo le funzionalità di base fornite dalla classe InputStream, nonché le classi principali che la implementano.
Prima di iniziare uno studio dettagliatometodi della classe InputStream, va detto che implementa le interfacce Closeable e AutoCloseable. L'interfaccia Closeable ci dice che quando finisci di lavorare con uno stream, questo deve essere chiuso. Questo viene fatto usando il metodo close(). Poiché la maggior parte dei metodi della classe InputStream genera una IOException in caso di errore, tutte le operazioni devono essere eseguite nel blocco try e il metodo close() deve essere inserito nel blocco finalmente in modo che funzioni indipendentemente dal risultato del lavoro nel corpo di prova.
L'interfaccia AutoCloseable riduce notevolmentela quantità di codice tecnico perché consente al metodo close() di attivarsi automaticamente e di non aggiungere un blocco finalmente al codice. Se stai usando la settima versione o successiva di Java, InputStream può essere inserito in un cosiddetto try with resource, che si occupa di tutte le operazioni di chiusura degli stream.
Diamo un'occhiata ai metodi principali della classe InputStream:
InputStream è implementato da diverse classi progettate per funzionare con diverse origini e tipi di dati. Di seguito è riportato l'albero dell'eredità.
Flusso di byte per leggere informazioni dai fileimplementato dalla classe FileInputStream. Per aprire un file in lettura byte è sufficiente creare un'istanza di questa classe, passando il nome del file come argomento al suo costruttore. Se il file con il nome passato non esiste, verrà generata un'eccezione di tipo FileNotFoundException.
Se il file viene aperto correttamente, il lavoro con esso viene eseguito utilizzando i metodi descritti sopra, poiché FileInputStream eredita da InputStream.
L'esempio precedente descriveva il lavoro convalori di byte che possono essere interpretati come caratteri. Ma cosa succede se abbiamo bisogno di leggere un valore intero, frazionario o booleano? Per fare ciò, in Java, InputStream viene indirettamente esteso dalla classe DataInputStream. Questa classe è un wrapper per un InputStream che gli viene passato quando viene creato come argomento del costruttore. Questo tipo di flusso legge i dati in formato binario.
DataInputStream implementa anche l'interfaccia DataInput e i suoi metodi per leggere i tipi di dati primitivi. Di seguito è riportato un elenco di questi metodi.
I nomi dei metodi parlano da soli: ognuno di essi è progettato per leggere un tipo specifico di dati.
È implementato un flusso di dati di lettura bufferizzatola classe BufferedInputStream in Java. InputStream è avvolto con questa classe. Questa classe integra il flusso con un buffer, che consente di leggere contemporaneamente non uno, ma diversi byte. Ciò consente di aumentare significativamente la produttività dell'operazione. BufferedInputStream è un discendente indiretto di InputStream e quindi eredita tutti i metodi precedenti.
Questa classe ha due costruttori:
Dalle firme dei costruttori si evince che il primo imposta la dimensione del buffer di default, mentre il secondo ha la possibilità di impostarla manualmente.
Abbiamo coperto le principali implementazioni di InputStream. Se hai bisogno di convertire i byte ricevuti in una stringa, allora in Il Java InputStream to String(), sfortunatamente, non è sovraccaricato, quindi è necessario utilizzare utilità speciali per questo, ad esempio IOUtils dalla libreria Apache Commons.