1. Filesclasse

Classe File

Per lavorare con i file, esiste una classe di utilità slick: java.nio.file.Files. Ha metodi per ogni occasione. Tutti i metodi di questa classe sono statici e operano sull'oggetto Path. Esistono molti metodi, quindi considereremo solo i più importanti:

Metodo Descrizione
Path createFile(Path path)
Crea un nuovo file il cui percorso èpath
Path createDirectory(Path path)
Crea una nuova directory
Path createDirectories(Path path)
Crea più directory
Path createTempFile(prefix, suffix)
Crea un file temporaneo
Path createTempDirectory(prefix)
Crea una directory temporanea
void delete(Path path)
Elimina un file o una directory se è vuoto
Path copy(Path src, Path dest)
Copia un file
Path move(Path src, Path dest)
Sposta un file
boolean isDirectory(Path path)
Controlla se il percorso è una directory e non un file
boolean isRegularFile(Path path)
Controlla se il percorso è un file e non una directory
boolean exists(Path path)
Controlla se esiste un oggetto nel percorso specificato
long size(Path path)
Restituisce la dimensione del file
byte[] readAllBytes(Path path)
Restituisce l'intero contenuto di un file come matrice di byte
String readString(Path path)
Restituisce l'intero contenuto di un file come stringa
List<String> readAllLines(Path path)
Restituisce l'intero contenuto di un file come un elenco di stringhe
Path write(Path path, byte[])
Scrive una matrice di byte in un file
Path writeString(Path path, String str)
Scrive una stringa in un file
DirectoryStream<Path> newDirectoryStream(Path dir)
Restituisce una raccolta di file (e sottodirectory) dalla directory specificata

2. Creazione di file e directory

I file e le directory sono molto facili da creare. Convinciamoci con alcuni esempi:

Codice Nota
Files.createFile(Path.of("c:\\readme.txt"));
Crea un file
Files.createDirectory(Path.of("c:\\test"));
Crea una directory
Files.createDirectories(Path.of("c:\\test\\1\\2\\3"));
Crea una directory e tutte le sottodirectory necessarie se non esistono.

3. Copiare, spostare e cancellare

Copiare, spostare ed eliminare file è altrettanto semplice. Questo vale anche per le directory, ma devono essere vuote.

Codice Nota
Path path1 = Path.of("c:\\readme.txt");
Path path2 = Path.of("c:\\readme-copy.txt");
Files.copy(path1, path2);
Copia un file
Path path1 = Path.of("c:\\readme.txt");
Path path2 = Path.of("d:\\readme-new.txt");
Files.move(path1, path2);
Sposta e rinomina un file
Path path = Path.of("d:\\readme-new.txt");
Files.delete(path);
Elimina un file

4. Verifica del tipo e dell'esistenza di un file

Quando hai un percorso fornito da qualcun altro, vuoi sapere se si tratta di un file o di una directory. E in generale, esiste o no un tale file/directory?

Ci sono anche metodi speciali per questo. Puoi anche scoprire facilmente la lunghezza di un file:

Codice Nota
Files.isRegularFile(Path.of("c:\\readme.txt"));
true
Files.isDirectory(Path.of("c:\\test"));
true
 Files.exists(Path.of("c:\\test\\1\\2\\3"));
false
Files.size(Path.of("c:\\readme.txt"));
10112

5. Lavorare con i contenuti dei file

Infine, esistono tutta una serie di metodi che facilitano la lettura o la scrittura del contenuto di un file. Esempio:

Codice Descrizione
Path path = Path.of("c:\\readme.txt");
List<String> list = Files.readAllLines(path);

for (String str : list)
   System.out.println(str);

Legge il contenuto del file come un elenco di stringhe.

Visualizza le stringhe


6. Ottenere il contenuto di una directory

Il metodo più interessante rimane ancora. Viene utilizzato per ottenere file e sottodirectory in una determinata directory.

Stiamo parlando del newDirectoryStream()metodo, che restituisce un DirectoryStream<Path>oggetto speciale. Ha un iteratore (!) che puoi usare per ottenere tutti i file e le sottodirectory di una data directory.

Questo è più facile di quanto sembri.

Codice Descrizione
Path path = Path.of("c:\\windows");

try (DirectoryStream<Path> files = Files.newDirectoryStream(path)) {
   for (Path path : files)
      System.out.println(path);
}


Ottieni un oggetto con un elenco di file
Passa sopra l'elenco dei file

L' DirectoryStream<Path>oggetto ha due proprietà. Innanzitutto, ha un iteratore che restituisce i percorsi dei file e possiamo utilizzare questo oggetto all'interno di un for-eachciclo.

E in secondo luogo, questo oggetto è un flusso di dati, quindi deve essere chiuso in modo esplicito utilizzando il close()metodo o dichiarato l'uso all'interno di un try-with-resourcesblocco.



7. Files.newInputStreammetodo

A partire da Java 5, le classi FileInputStreame FileOutputStreamsono state deprecate. Uno dei loro svantaggi era che quando vengono creati oggetti di queste classi, i file vengono immediatamente creati su disco. E tutte le eccezioni relative alla creazione di file potrebbero essere potenzialmente generate.

Successivamente questa è stata riconosciuta come non la decisione migliore. Di conseguenza, si consiglia di utilizzare i metodi della java.nio.Filesclasse di utilità per creare oggetti file.

Ecco un confronto tra il vecchio approccio e il nuovo approccio alla creazione di file:

Prima
String src = "c:\\projects\\log.txt";
InputStream input = new FileInputStream(src);
Dopo
String src = "c:\\projects\\log.txt";
InputStream input = Files.newInputStream( Path.of(src) );

E c'è un sostituto simile per FileOutputStream:

Prima
String src = "c:\\projects\\log.txt";
OutputStream  output = new FileOutputStream( src );
Dopo
String src = "c:\\projects\\log.txt";
OutputStream  output = Files.newOutputStream( Path.of( src ) );