1. OutputStream
classe
Di recente abbiamo esplorato i flussi di input. È ora di parlare dei flussi di output.
La OutputStream
classe è la classe genitore per tutte le classi che supportano l'output in byte. Questa è una classe astratta che non fa nulla da sola, ma ha classi discendenti per ogni occasione.
Sembra estremamente complicato. Per dirla più semplicemente, questa classe opera su byte e non, ad esempio, su caratteri o altri tipi di dati. E il fatto che sia astratto significa che di solito non lo usiamo, ma piuttosto una delle sue classi discendenti. Ad esempio, FileOutputStream
e simili.
Ma torniamo alla OutputStream
classe. Questa classe ha metodi che tutte le sue classi discendenti devono implementare. Ecco i principali:
Metodi | Descrizione |
---|---|
|
Scrive un byte (non un int ) nel flusso. |
|
Scrive una matrice di byte nel flusso |
|
Scrive parte di una matrice di byte nel flusso |
|
Scrive nel flusso tutti i dati archiviati nel buffer |
|
Chiude il flusso |
Quando crei un oggetto di una classe che eredita InputStream
, di solito specifichi un oggetto sorgente da cui InputStream
legge i dati. Quando crei un oggetto di una classe che eredita OutputStream
, di solito specifichi anche l'oggetto o il flusso di destinazione in cui verranno scritti i dati.
Esaminiamo brevemente tutti i metodi della OutputStream
classe:
write(int b)
metodo
Questo metodo scrive un byte (non un int
) nel flusso di output. Il valore passato viene convertito in un byte e i primi tre byte di int vengono scartati.
write(byte[] buffer)
metodo
Scrive la matrice di byte specificata nel flusso di output. Questo è tutto.
write(byte[] buffer, int offset, int length)
metodo
Scrive una parte della matrice di byte passata nel flusso di output. La variabile offset indica l'indice del primo elemento dell'array, ed length
è la lunghezza del sottoinsieme da scrivere.
flush()
metodo
Il flush()
metodo viene utilizzato per forzare la scrittura nel flusso di destinazione di qualsiasi dato potenzialmente memorizzato nel buffer nel flusso corrente. Ciò è rilevante quando si utilizza il buffering e/o più oggetti stream disposti in una catena.
close()
metodo
Scrive tutti i dati non scritti nell'oggetto di destinazione. close()
Non è necessario chiamare il metodo se si utilizza un try-with-resources
blocco.
Esempio di copia di un file
Codice | Nota |
---|---|
|
InputStream per leggere da un file OutputStream per scrivere in un file Buffer in cui leggeremo i dati Finché ci sono dati nel flusso Leggere i dati nel buffer Scrivere i dati dal buffer nel secondo flusso |
2. Writer
classe
La Writer
classe è esattamente la stessa della OutputStream
classe, ma solo una differenza ancora una volta: funziona con i caratteri ( char
) invece che con i byte.
Questa è una classe astratta: non puoi creare oggetti della Writer
classe. Il suo obiettivo principale è essere una classe genitore comune per centinaia di classi discendenti e fornire loro metodi comuni per lavorare con i flussi di caratteri.
Metodi della Writer
classe (e di tutte le sue classi discendenti):
Metodi | Descrizione |
---|---|
|
Scrive un carattere (non un int ) nel flusso. |
|
Scrive una matrice di caratteri nel flusso |
|
Scrive parte di una matrice di caratteri nel flusso |
|
Scrive una stringa nel flusso |
|
Scrive parte di una stringa nel flusso |
|
Scrive nel flusso tutti i dati archiviati nel buffer |
|
Chiude il flusso |
I metodi sono molto simili ai metodi della OutputStream
classe, ma funzionano con caratteri invece che con byte.
Descrizione dei metodi:
write(int b)
metodo
Questo metodo scrive un singolo carattere ( char
— non un int
) nel flusso di output. Il valore passato viene convertito in a char
e i primi due byte vengono eliminati.
write(char[] buffer)
metodo
Scrive la matrice di caratteri specificata nel flusso di output.
write(char[] buffer, int offset, int length)
metodo
Scrive una parte della matrice di caratteri passata nel flusso di output. La offset
variabile indica l'indice del primo elemento dell'array, ed length
è la lunghezza del sottoinsieme da scrivere.
write(String str)
metodo
Scrive la stringa data nel flusso di output.
write(String str, int offset, int length)
metodo
Scrive una parte della stringa data nel flusso di output: la stringa viene convertita in un array di caratteri. La offset
variabile indica l'indice del primo elemento dell'array, ed length
è la lunghezza del sottoinsieme da scrivere.
flush()
metodo
Il flush()
metodo viene utilizzato per forzare la scrittura nel flusso di destinazione di qualsiasi dato potenzialmente memorizzato nel buffer nel flusso corrente. Ciò è rilevante quando si utilizza il buffering e/o più oggetti stream disposti in una catena.
close()
metodo
Scrive tutti i dati non scritti nell'oggetto di destinazione. close()
Non è necessario chiamare il metodo se si utilizza un try-with-resources
blocco.
Esempio di un programma che copia un file di testo:
Codice | Nota |
---|---|
|
Reader per la lettura da un file Writer per la scrittura in un file Buffer in cui leggeremo i dati Finché ci sono dati nello stream Leggere i dati in un buffer Scrivere i dati dal buffer nel secondo stream |
StringWriter
classe
C'è un'altra classe interessante che eredita la Writer
classe: si chiama StringWriter
. Contiene una stringa mutabile — un StringBuffer
oggetto. E ogni volta che "scrivi" qualcosa sull'oggetto StringWriter
, il testo viene semplicemente aggiunto al suo buffer interno.
Esempio:
Codice | Nota |
---|---|
|
StringWriter Viene creato un flusso di caratteri di destinazione ( ) Viene scritta una stringa nel buffer all'interno di StringWriter Una stringa viene scritta nel buffer all'interno di StringWriter Conversione del contenuto di un oggetto in una stringa |
In questo caso, la StringWriter
classe è essenzialmente un wrapper della StringBuffer
classe, ma la StringWriter
classe è un discendente della Writer
classe stream e può essere utilizzata in catene di oggetti stream. Questa è una proprietà piuttosto utile in pratica.