"Oh, Rishi! Ciao!"

"Ciao, Amigo! Come va la vita?"

"Fantastico. Bilaabo mi ha appena raccontato un sacco di cose interessanti su File e su come lavorarci."

"Si dà il caso che penso di avere qualcosa da aggiungere su questo argomento."

"Davvero? Allora sono tutt'orecchi."

"Va bene, ascolta. Java è in continua evoluzione. I suoi sviluppatori sono costantemente alla ricerca di nuovi modi per fare cose diverse in modo più efficiente. In Java 7, hanno aggiunto un'alternativa alla classe File."

File, percorso - 1

"Alternativa?"

"Sì. Hanno preso la classe File come base, hanno aggiunto alcune nuove cose, rinominato i metodi e poi l'hanno anche divisa in due. Quindi ora ci sono due nuove classi: Path e FilesPath è in realtà il nuovo analogo di File class e File è una classe di utilità (analoga alle classi Arrays e Collections). Tutti i metodi statici della classe File vanno lì. Farlo in questo modo è 'più corretto' in termini di OOP."

"Beh, se è in termini di OOP, allora va bene. Quindi cosa è cambiato?"

"In primo luogo, hanno deciso di non riprodurre i metodi che restituiscono  oggetti String  e File . Nella classe Path  , tutti i metodi restituiscono un Path .

"In secondo luogo, hanno spostato molti metodi di utilità statici nella classe Files ."

"In terzo luogo, è diventato più conveniente lavorare con percorsi relativi".

"Ecco un elenco dei metodi:"

Metodi della classe Path Descrizione
boolean isAbsolute() Restituisce true se il percorso è assoluto.
Path getRoot() Restituisce la radice del percorso corrente, ovvero la directory più in alto.
Path getFileName() Restituisce il nome del file dal percorso corrente.
Path getParent() Restituisce la directory dal percorso corrente.
boolean startsWith(Path other) Controlla se il percorso corrente inizia con il percorso passato.
boolean endsWith(Path other) Controlla se il percorso corrente termina con il percorso passato.
Path normalize() Normalizza il percorso corrente. Ad esempio, converte «c:/dir/dir2/../a.txt» in «c:/dir/a.txt»
Path relativize(Path other) Calcola il cammino relativo di due cammini, cioè «la differenza tra i cammini»
Path resolve(String other) Risolve un percorso assoluto utilizzando i percorsi correnti e relativi.
URI toUri() Restituisce l'URI se il percorso/file corrente.
Path toAbsolutePath() Converte il percorso in un percorso assoluto se è relativo.
File toFile() Restituisce un oggetto File che corrisponde all'oggetto Path corrente.

"E il percorso attuale... che cos'è?"

"Questo è il percorso che è stato passato al costruttore dell'oggetto Path i cui metodi vengono chiamati."

"OK. Quindi quali metodi ha la classe Files ?"

"Hai fretta di arrivare da qualche parte? Te lo dico subito. Ecco i metodi più importanti:"

Metodi della classe Files Descrizione
Path createFile(…) Crea un file su disco.
Path createDirectory(…) Crea una directory.
Path createDirectories(…) Crea una directory e tutte le sue sottodirectory.
Path createTempFile(…) Crea un file temporaneo.
Path createTempDirectory(…) Crea una directory temporanea.
void delete(Path path) Elimina un file.
Path copy(Path source, Path target,…) Copia un file.
Path move(Path source, Path target,…) Sposta un file.
boolean isSameFile(Path, Path) Confronta due file.
boolean isDirectory(Path) Il percorso è una directory?
boolean isRegularFile(Path) Il percorso è un file?
long size(Path) Restituisce la dimensione del file.
boolean exists(Path) Esiste un oggetto con lo stesso nome?
boolean notExists(Path) Non esiste un oggetto con lo stesso nome?
long copy(InputStream, OutputStream) Copia i byte da InputStream a OutputStream.
long copy(Path, OutputStream) Copia tutti i byte da Path a OutputStream.
long copy(InputStream, Path) Copia tutti i byte da InputStream a Path.
byte[] read(InputStream, int initialSize) Legge una matrice di byte da InputStream.
byte[] readAllBytes(Path path) Legge tutti i byte da InputStream.
List<String> readAllLines(Path path,..) Legge il file di testo e restituisce un elenco di stringhe.
Path write(Path path, byte[] bytes,…) Scrive una matrice di byte in un file.

"Che interessante! Tante fantastiche funzioni e tutte nello stesso posto."

"Beh, guarda. Supponiamo che tu voglia scaricare un file da Internet e poi inviarlo a qualcuno. Per fare ciò, è molto comodo creare un file temporaneo su disco e salvarci i dati letti."

"È difficile scaricare un file da Internet?"

"È molto semplice. Guarda questo esempio:"

Codice
URL url = new URL("https://www.google.com.ua/images/srpr/logo11w.png");
InputStream inputStream = url.openStream();

Path tempFile = Files.createTempFile("temp-",".tmp");
Files.copy(inputStream, tempFile);

"E questo è tutto?"

"Sì, cosa ti aspettavi di vedere? Ci sono solo 4 righe."

" Riga 1.  Crea un oggetto URL, a cui viene passato l'URL del file immagine.

" Riga 2.  Viene aperto uno stream per la lettura di un file (InputStream) sull'oggetto url.

" Riga 3.  Il createTempFilemetodo viene utilizzato per creare un file temporaneo.

" Riga 4.  Il metodo Files.copy copia i dati da  inputStream a tempFile. Tutto qui."

"Ingegnoso!"

"Fantastico. Sono contento che ti piaccia. Penso che tu possa capire da solo il resto dei metodi. E chiederò a Diego di affidarti diversi compiti al riguardo."

"A proposito, ecco un buon link su questo materiale"