1. OutputStreamclasse

Di recente abbiamo esplorato i flussi di input. È ora di parlare dei flussi di output.

La OutputStreamclasse è 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, FileOutputStreame simili.

Ma torniamo alla OutputStreamclasse. Questa classe ha metodi che tutte le sue classi discendenti devono implementare. Ecco i principali:

Metodi Descrizione
void write(int b)
Scrive un byte (non un int) nel flusso.
void write(byte[] buffer)
Scrive una matrice di byte nel flusso
void write(byte[] buffer, off, len)
Scrive parte di una matrice di byte nel flusso
void flush()
Scrive nel flusso tutti i dati archiviati nel buffer
void close()
Chiude il flusso

Quando crei un oggetto di una classe che eredita InputStream, di solito specifichi un oggetto sorgente da cui InputStreamlegge 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 OutputStreamclasse:

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-resourcesblocco.

Esempio di copia di un file

Codice Nota
String src = "c:\\projects\\log.txt";
String dest = "c:\\projects\\copy.txt";

try(FileInputStream input = new FileInputStream(src);
FileOutputStream output = new FileOutputStream(dest))
{
   byte[] buffer = new byte[65536]; // 64Kb
   while (input.available() > 0)
   {
      int real = input.read(buffer);
      output.write(buffer, 0, real);
   }
}



InputStreamper leggere da un file
OutputStreamper 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. Writerclasse

La Writerclasse è esattamente la stessa della OutputStreamclasse, 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 Writerclasse. 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 Writerclasse (e di tutte le sue classi discendenti):

Metodi Descrizione
void write(int b)
Scrive un carattere (non un int) nel flusso.
void write(char[] buffer)
Scrive una matrice di caratteri nel flusso
void write(char[] buffer, off, len)
Scrive parte di una matrice di caratteri nel flusso
void write(String str)
Scrive una stringa nel flusso
void write(String str, off, len)
Scrive parte di una stringa nel flusso
void flush()
Scrive nel flusso tutti i dati archiviati nel buffer
void close()
Chiude il flusso

I metodi sono molto simili ai metodi della OutputStreamclasse, 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 chare 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 offsetvariabile 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 offsetvariabile 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-resourcesblocco.

Esempio di un programma che copia un file di testo:

Codice Nota
String src = "c:\\projects\\log.txt";
String dest = "c:\\projects\\copy.txt";

try(FileReader reader = new FileReader(src);
FileWriter writer = new FileWriter(dest))
{
   char[] buffer = new char[65536]; // 128Kb
   while (reader.ready())
   {
      int real = reader.read(buffer);
      writer.write(buffer, 0, real);
   }
}



Readerper la lettura da un file
Writerper 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

StringWriterclasse

C'è un'altra classe interessante che eredita la Writerclasse: si chiama StringWriter. Contiene una stringa mutabile — un StringBufferoggetto. E ogni volta che "scrivi" qualcosa sull'oggetto StringWriter, il testo viene semplicemente aggiunto al suo buffer interno.

Esempio:

Codice Nota
StringWriter writer = new StringWriter();
writer.write("Hello");
writer.write(String.valueOf(123));

String result = writer.toString();
StringWriterViene 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 StringWriterclasse è essenzialmente un wrapper della StringBufferclasse, ma la StringWriterclasse è un discendente della Writerclasse stream e può essere utilizzata in catene di oggetti stream. Questa è una proprietà piuttosto utile in pratica.