1. Pathclasse

Se vuoi scrivere un programma che faccia qualcosa con i file su disco, è abbastanza facile. Java ha molte classi che ti aiutano a lavorare sia con i file stessi che con i loro contenuti.

Le prime versioni di Java utilizzavano classi come Filee FileInputStreamper lavorare con i file. Tuttavia, la Fileclasse è ora deprecata e non se ne consiglia l'uso. Naturalmente, potresti ancora incontrarlo nel codice, nei parametri del metodo o nei costruttori di classi.

Fin dall'inizio, inizieremo a imparare come lavorare con i file usando la Pathclasse. Pathè la classe che ha sostituito File. È più sicuro ed efficiente.

Pathclasse

Tecnicamente, Pathnon è una classe, è un'interfaccia. Questo viene fatto per consentire la scrittura di un discendente della Pathclasse per ogni sistema operativo (e file system).

Windows ha uno standard per la scrittura dei percorsi dei file e Linux ne ha un altro. Naturalmente, ci sono molti altri sistemi operativi nel mondo e ognuno ha il proprio standard.

Ecco perché l' Pathinterfaccia è usata ovunque nei metodi che lavorano con i file, anche se in realtà il lavoro avviene attraverso le sue classi discendenti: WindowsPath, UnixPath, ...

Creazione di un Pathoggetto

Per creare un Pathoggetto (che sarà effettivamente un oggetto della WindowsPathclasse discendente), è necessario utilizzare un'istruzione come questa:

Path name = Path.of(path);

Dove nameè il nome di una Pathvariabile ed pathè il percorso del file (o directory) incluso il nome del file (o directory). Ed ofè un metodo statico della Pathclasse.

Il of()metodo viene utilizzato per creare WindowsPathoggetti se il programma è in esecuzione su Windows. Se il programma è in esecuzione su Linux, UnixPathvengono creati gli oggetti. Non puoi creare un Pathoggetto usando codice come .new Path()

Esempi:

Codice Nota
Path file = Path.of("c:\\projects\\note.txt");
Percorso del file
Path directory = Path.of("c:\\projects\\");
Percorso della directory

Non è necessario che il file (o la directory) esista affinché Pathesista un oggetto valido. Forse vuoi solo creare un file... Un Pathoggetto è come un truccato String: non è legato a un file specifico su disco - memorizza solo un certo percorso su disco. Questo è tutto.


2. Metodi del Pathtipo

L' Pathinterfaccia ha alcuni metodi interessanti. I più interessanti sono presentati nella tabella sottostante.

Metodo Descrizione
Path getParent()
Restituisce la directory principale
Path getFileName()
Restituisce il nome del file senza la directory
Path getRoot()
Restituisce la directory radice da un percorso
boolean isAbsolute()
Controlla se il percorso corrente è assoluto
Path toAbsolutePath()
Converte il percorso in assoluto
Path normalize()
Rimuove i caratteri jolly in un nome di directory.
Path resolve(Path other)
Costruisce un nuovo percorso assoluto da percorsi assoluti e relativi.
Path relativize(Path other)
Ottiene un percorso relativo da due percorsi assoluti.
boolean startsWith(Path other)
Controlla se il percorso corrente inizia con un determinato percorso
boolean endsWith(Path other)
Controlla se il percorso corrente termina con un determinato percorso
int getNameCount()
Divide il percorso in parti usando /come delimitatore.
Restituisce il numero di parti.
Path getName(int index)
Divide il percorso in parti usando /come delimitatore.
Restituisce una parte in base al relativo indice.
Path subpath(int beginIndex, int endIndex)
Divide il percorso in parti usando /come delimitatore.
Restituisce il sottopercorso che corrisponde all'intervallo specificato.
File toFile()
Converte un oggetto in un oggetto PathdeprecatoFile
URI toUri()
Converte un Pathoggetto in un URIoggetto

Di seguito una breve descrizione delle modalità esistenti.


3. Dividere un percorso in parti

Il getParent()metodo restituisce il percorso che punta alla directory padre per il percorso corrente. Indipendentemente dal fatto che questo percorso sia una directory o un file:

Codice Valore
String str = "c:\\windows\\projects\\note.txt";
Path path = Path.of(str).getParent();
"c:\\windows\\projects\\"
String str = "c:\\windows\\projects\\";
Path path = Path.of(str).getParent();
"c:\\windows\\"
String str = "c:\\";
Path path = Path.of(str).getParent();
null

Il getFileName()metodo restituisce un singolo nome di file (o directory), qualunque cosa venga dopo l'ultimo delimitatore:

Codice Valore
String str = "c:\\windows\\projects\\note.txt";
Path path = Path.of(str).getFileName();
"note.txt"
String str = "c:\\windows\\projects\\";
Path path = Path.of(str).getFileName();
"projects"
String str = "c:\\";
Path path = Path.of(str).getFileName();
null

Il getRoot()metodo restituisce il percorso della directory principale:

Codice Valore
String str = "c:\\windows\\projects\\";
Path path = Path.of(str).getRoot();
"c:\\"


4. Percorsi assoluti e relativi

Esistono due tipi di percorsi: assoluto e relativo. Un percorso assoluto inizia dalla directory principale. Per Windows, questa potrebbe essere la c:\cartella; per Linux — la /directory

Un percorso relativo è significativo rispetto a qualche directory. Cioè, è come la fine della strada, ma senza l'inizio. Puoi trasformare un percorso relativo in un percorso assoluto e viceversa

boolean isAbsolute()metodo

Il metodo controlla se il percorso corrente è assoluto

Codice Valore
String str = "c:\\windows\\projects\\note.txt";
boolean abs = Path.of(str).isAbsolute();
true
String str = "src\\com\\codegym\\Main.java";
boolean abs = Path.of(str).isAbsolute();
false

Path toAbsolutePath()metodo

Converte il percorso in assoluto. Se necessario, vi aggiunge la directory di lavoro corrente:

Codice Valore
String str = "c:\\windows\\projects\\note.txt";
Path path = Path.of(str).toAbsolutePath();
"c:\\windows\\projects\\note.txt"
String str = "src\\com\\codegym\\Main.java";
Path path = Path.of(str).toAbsolutePath();
"d:\\work\\src\\com\\codegym\\Main.java"

Path normalize()metodo

Nel percorso, invece del nome di una directory, puoi scrivere "..", che significa tornare indietro di una directory . La normalizzazione elimina queste cose. Esempi:

Codice Valore
String str = "c:\\windows\\..\\projects\\note.txt";
Path path = Path.of(str).normalize();
"c:\\projects\\note.txt"
String str = "src\\com\\codegym\\..\\Main.java";
Path path = Path.of(str).normalize();
"src\\com\\Main.java"

Path relativize(Path other)metodo

Il relativize()metodo consente di costruire le "differenze tra percorsi": un percorso relativo a un altro

Codice Valore
Path path1 = Path.of("c:\\windows\\projects\\note.txt");
Path path2 = Path.of("c:\\windows\\");
Path result = path2.relativize(path1);
"projects\\note.txt"
Path path1 = Path.of("c:\\windows\\projects\\note.txt");
Path path2 = Path.of("c:\\windows\\");
Path result = path1.relativize(path2);
"..\\.."
Path path1 = Path.of("c:\\aaa\\bbb\\1.txt");
Path path2 = Path.of("d:\\zzz\\y.jpg");
Path result = path1.relativize(path2);
IllegalArgumentException:
i due percorsi hanno una "radice" diversa (dischi diversi)

Path resolve(Path other)metodo

Il resolve()metodo fa l'opposto di relativize(): costruisce un nuovo percorso assoluto da un percorso assoluto e uno relativo.

Codice Valore
Path path1 = Path.of("projects\\note.txt");
Path path2 = Path.of("c:\\windows\\");
Path result = path1.resolve(path2);
"c:\\windows"
Path path1 = Path.of("projects\\note.txt");
Path path2 = Path.of("c:\\windows\\");
Path result = path2.resolve(path1);
"c:\\windows\\projects\\note.txt"

toFile()metodo

Il metodo restituisce un Fileoggetto deprecato che memorizza lo stesso percorso file dell'oggetto Path.

toURI()metodo

Il metodo converte il percorso in un URI standard e restituisce un oggetto che contiene il percorso del file:

Percorso del file URI del file
c:\windows\projects\note.txt
file:///c:/windows/projects/note.txt