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.
3. PrintStream
classe
Le classi del flusso di output possono anche essere inserite in una catena con flussi intermedi che scrivono i dati nel flusso di destinazione passato loro. La vista generale dell'interazione di questi flussi è la seguente:
Il più interessante e versatile di tutti i flussi di output intermedi è PrintStream
. Ha decine di metodi e ben 12 costruttori.
La PrintStream
classe eredita la FilterOutputStream
classe, che eredita OutputStream
. Ciò significa che la PrintStream
classe ha tutti i metodi delle classi padre oltre ai propri metodi . Ecco i più interessanti:
Metodi | Descrizione |
---|---|
|
Converte l'oggetto passato in una stringa e lo restituisce al flusso di destinazione. |
|
Converte l'oggetto passato in una stringa e lo restituisce al flusso di destinazione. Aggiunge un'interruzione di riga alla fine |
|
Emette un carattere di interruzione di riga nel flusso di destinazione |
|
Costruisce e restituisce una stringa basata sulla stringa di formato e sugli argomenti passati; simile al String.format() metodo |
E dove sono queste decine di metodi, chiedi?
Bene, ha molte varianti di print()
e println()
metodi con parametri diversi. Possono essere riassunti in questa tabella.
Non ci addentreremo in questi metodi, perché li conosci già bene. Riesci a indovinare a cosa sto arrivando?
Ricordi System.out.println()
? Ma si può scrivere in due righe:
Codice | Uscita console |
---|---|
|
|
Il nostro comando preferito è una chiamata al metodo sulla variabile statica della classe. E il tipo di questa variabile è .System.out.println()
println()
out
System
PrintStream
In molti livelli di CodeGym, e in quasi tutte le attività, hai chiamato i metodi della PrintStream
classe senza nemmeno saperlo!
Uso pratico
Java ha questa classe interessante chiamata ByteArrayOutputStream
, che è un array di byte in crescita dinamica che eredita OutputStream
.
Un ByteArrayOutputStream
oggetto e PrintStream
un oggetto possono essere concatenati in questo modo:
Codice | Descrizione |
---|---|
|
Crea un buffer di scrittura in memoria Avvolgi il buffer in un PrintStream oggetto Scrivi i dati nella console Converti l'array in una stringa! Uscita console:
|
GO TO FULL VERSION