"Ciao, Amigo. Tanto tempo, non ci vediamo."

"Ciao, Bilaabo. Di cosa parlerai?"

"Oggi ti parlerò di come lavorare con i file.  Java ha una classe speciale (File) che puoi usare per gestire i file su un disco rigido. Per gestire i contenuti dei file, ci sono altre classi: FileInputStream, FileOutputStream, ecc. "

File, file, percorso - 1

"Interessante. Ma quando dici 'gestisci file', cosa intendi?"

"Questo è proprio quello che spiegherò ora. I file possono essere creati, cancellati, rinominati e molto altro ancora. Puoi passare un oggetto File praticamente a ogni classe che lavora con (legge, scrive, modifica) il contenuto di un file . Per esempio:"

Puoi passare il nome del file direttamente a FileInputStream
FileInputStream input = new FileInputStream("c:/path/a.txt");
Oppure puoi creare un oggetto File separatamente e quindi passarlo a FileInputStrea
File file = new File("c:/path/a.txt");
FileInputStream input = new FileInputStream(file);

"Ma la seconda opzione è più lunga. Continuo a non capire perché abbiamo bisogno di questi oggetti file."

"Per questo esempio specifico, hai ragione. "Questo non è un esempio di come devi farlo, ma piuttosto di come puoi farlo.
Ma immagina di dover visualizzare un elenco di tutti i file che si trovano in una directory specifica. Ecco come è possibile farlo utilizzando gli oggetti File:"

Codice
File folder = new File("c:/path/");
for (File file : folder.listFiles())
{
 System.out.println(file.getName());
}

" listFiles() è un metodo che restituisce un elenco di file nella cartella indicata da «c:/path/»?"

"Sì. Ma i programmatori di solito dicono 'directory'. Il termine 'cartella' è entrato in uso relativamente di recente, ma in linea di principio entrambi i termini sono corretti e puoi dire quello che preferisci."

"OK. E cosa fa getName ()? Restituisce il nome del file? Cosa è incluso esattamente nel nome? Il nome completo incluso il percorso o solo il nome del file stesso?"

"Solo il nome del file stesso. Per il percorso completo, c'è file.getAbsolutePath()."

"Quindi quali altri metodi ha la classe File?"

"Guarda questo:"

Metodo Descrizione
boolean isDirectory() L'oggetto File è una directory?
boolean isFile() L'oggetto è un file?
long length() Restituisce la dimensione/lunghezza del file in byte.
boolean createNewFile() Crea un nuovo file vuoto se non esiste ancora un file con questo nome.
boolean mkdir() Crea una directory. Il nome «mkdir» deriva da «make directory».
boolean mkdirs() Crea una directory e tutte le sue sottodirectory.
boolean delete() Elimina il file associato all'oggetto. Se l'oggetto è una directory, la directory viene eliminata solo se non contiene file.
void deleteOnExit() Aggiunge il file a un elenco speciale di file che verranno automaticamente eliminati all'uscita dal programma.
File createTempFile(
String prefix,
String suffix,
File directory)
Crea un file temporaneo con un nome univoco generato casualmente, qualcosa come «dasd4d53sd».
I parametri aggiuntivi sono un prefisso e un suffisso del nome. Se non viene specificata una directory, il file viene creato in una directory del sistema operativo speciale per i file temporanei.
boolean exists() Restituisce true se sul disco rigido esiste un file con lo stesso nome.
String getAbsolutePath() Restituisce il percorso completo del file con tutte le sue sottodirectory.
String getCanonicalPath() Restituisce il percorso del file canonico.
Ad esempio, converte il percorso «c:/dir/dir2/../a.txt» in «c:/dir/a.txt»
String[] list() Restituisce un array dei nomi dei file contenuti nella directory rappresentata dall'oggetto corrente.
File[] listFiles() Restituisce un array di file contenuti nella directory rappresentata dall'oggetto File corrente.
long getTotalSpace() Restituisce la quantità di spazio totale (numero di byte) sul disco in cui si trova il file.
long getFreeSpace() Restituisce la quantità di spazio libero (numero di byte) sul disco in cui si trova il file.
boolean renameTo(File) Rinomina il file, cioè il contenuto del file riceve effettivamente un nuovo nome. In altre parole, puoi rinominare il file «c:/dir/a.txt» in «d:/out/text/b.doc».
String getName() Restituisce solo il nome del file senza il percorso.
String getParent() Restituisce solo il percorso (directory) del file corrente, senza il nome stesso.
Path toPath() Restituisce un oggetto Path che corrisponde all'oggetto File corrente.

"Whoa! Non un elenco molto piccolo, eh? E sembra che tu possa fare molto con esso: creare ed eliminare file, rinominarli,..."

"Quindi per ottenere la directory del file corrente, devo chiamare getParent()?"

"Sì, ma restituisce una stringa ― il percorso del file ― non un oggetto File. In realtà, la classe File duplica quasi tutti i suoi metodi: una versione restituisce una stringa, l'altra ― un oggetto File. Dai un'occhiata:"

File file = new File("c:/path/a.txt");
String directory = file.getParent();
File file = new File("c:/path/a.txt");
File directory = file.getParentFile();

Se hai una stringa con il percorso del file e hai bisogno di un oggetto File , usa il costruttore. Se la situazione è invertita (hai un oggetto File ma hai bisogno di una stringa), usa getAbsolutePath (). Per esempio:"

String path = "c:/a.txt";
File file = new File(path);
File file = new File("c:/a.txt");
String path = file.getAbsolutePath();

"Fatto."

"Fantastico. Allora ecco un piccolo compito per te: mostra i nomi di tutti i file che si trovano nella stessa directory del file corrente."

"Niente di più facile. Ecco, guarda:"

Codice
//Some file
File originalFile = new File("c:/path/dir2/a.txt");

//An object representing the directory
File folder = originalFile.getParentFile();

//Print the file list on screen
for (File file : folder.listFiles())
{
 System.out.println(file.getName());
}

"Hmm. Esatto."

"Ma crea un po' di confusione il fatto che la stessa classe ― File ― sia utilizzata sia per il file che per la directory. Non mi sembra molto logico."

"Ha funzionato in questo modo per ragioni storiche. Una directory era uno speciale file 'vuoto' su disco. Certo, ora sono cambiate molte cose, ma non tutto. Oggi è tutto quello che ho."

"Grazie per l'interessante lezione, Bilaabo."