"Inizieremo con i flussi per l'input/output dei file. Ma prima le cose."
Esistono due classi per la lettura e la scrittura di file: FileInputStream e FileOutputStream . Come probabilmente hai già intuito, FileInputStream può leggere sequenzialmente byte da un file e FileOutputStream può scrivere sequenzialmente byte su un file. Ecco i metodi che hanno queste classi:
Metodo | Cosa fa il metodo |
---|---|
|
— Questo è il costruttore. Consente di specificare il nome di un file su disco, dal quale l'oggetto creato leggerà i dati. |
|
— Questo metodo legge un byte dal file e lo restituisce. Il valore restituito viene ampliato a un int. |
|
— Questo metodo restituisce il numero di byte non letti (disponibili). |
|
— Questo metodo «chiude» il flusso. Lo chiami quando hai finito di lavorare con lo stream. L'oggetto quindi esegue le operazioni di pulizia necessarie per chiudere il file, ecc. A questo punto, non è possibile leggere altri dati dallo stream. |
Solo per il gusto di farlo, calcoliamo la somma di tutti i byte in un file. Ecco come appare il codice:
public static void main(String[] args) throws Exception
{
//Create a FileInputStream object bound to «c:/data.txt».
FileInputStream inputStream = new FileInputStream("c:/data.txt");
long sum = 0;
while (inputStream.available() > 0) //as long as there are unread bytes
{
int data = inputStream.read(); //Read the next byte
sum += data; //Add it to the running total
}
inputStream.close(); // Close the stream
System.out.println(sum); // Display the sum on the screen.
}
"Abbiamo già esaminato qualcosa del genere. Come è organizzato FileOutputStream?"
"OK. Guarda questo:"
Metodo | Cosa fa il metodo |
---|---|
|
"Questo è il costruttore. Ti consente di specificare il nome di un file su disco, in cui l'oggetto creato scriverà i dati." |
|
"Questo metodo scrive il byte successivo, troncando i dati a un byte." |
|
"I dati da scrivere spesso vengono prima raccolti in grandi blocchi in memoria e poi scritti solo su disco."
Il comando flush forza la scrittura su disco di tutte le informazioni non salvate. |
|
"Questo metodo «chiude» il flusso. Lo chiami quando hai finito di lavorare con il flusso." L'oggetto esegue quindi le operazioni di pulizia necessarie per chiudere il file, ecc. |
Non è più possibile scrivere dati nel flusso e flush viene chiamato automaticamente.
"Questo è tutto?"
"Sì, in realtà c'è solo un metodo per scrivere: write (). Scrive solo un byte alla volta. Ma ti consente di scrivere tutte le informazioni che vuoi nel file."
La programmazione è un processo di divisione di un compito grande e complesso in molti piccoli. Essenzialmente lo stesso processo sta accadendo qui: la lettura e la scrittura di grandi blocchi di dati viene suddivisa in lettura e scrittura in piccoli pezzi, un byte alla volta.
Ecco come puoi utilizzare queste classi per copiare un file su disco:
public static void main(String[] args) throws Exception
{
//Create a stream to read bytes from a file
FileInputStream inputStream = new FileInputStream("c:/data.txt");
//Create a stream to write bytes to a file
FileOutputStream outputStream = new FileOutputStream("c:/result.txt");
while (inputStream.available() > 0) //as long as there are unread bytes
{
int data = inputStream.read(); // Read the next byte into the data variable
outputStream.write(data); // and write it to the second stream
}
inputStream.close(); //Close both streams. We don't need them any more.
outputStream.close();
}
"Grazie, Rishi. Finalmente ho capito come funziona questo codice."
GO TO FULL VERSION