Ce face Path.normalize
normalize() curăță calea de părțile redundante: . înseamnă „aici” și dispare, iar nume/.. înseamnă „intră și ieși” și dispare și el. Din poze/./2026/../2025/mare.jpg rămâne poze/2025/mare.jpg.
Lucrează doar pe textul căii, fără să întrebe discul. Un .. de la începutul unei căi relative rămâne (nu are ce elimina). Este util și pentru siguranță: după normalize poți verifica cu startsWith că o cale primită de la utilizator nu iese din folderul permis.
Ce returnează
Un Path nou, simplificat.
Exemple
Exemplul 1: Simplificări
import java.nio.file.Path;
public class Main {
public static void main(String[] args) {
System.out.println(Path.of("poze/./2026/../2025/mare.jpg").normalize());
System.out.println(Path.of("./note.txt").normalize());
System.out.println(Path.of("a/b/../../c").normalize());
System.out.println(Path.of("../date/./x.txt").normalize());
}
}
Rezultat
poze/2025/mare.jpg
note.txt
c
../date/x.txt
Exemplul 2: Verificarea unei căi primite de la utilizator
Un nume ca ../../parole.txt ar ieși din folderul publice. După normalize, startsWith prinde încercarea.
import java.nio.file.Path;
public class Main {
static boolean permis(Path baza, String cerut) {
Path cale = baza.resolve(cerut).normalize();
return cale.startsWith(baza);
}
public static void main(String[] args) {
Path baza = Path.of("publice");
for (String cerere : new String[]{"poze/logo.png", "css/../index.html", "../../parole.txt"}) {
System.out.println(cerere + " -> " + (permis(baza, cerere) ? "permis" : "interzis"));
}
}
}
Rezultat
poze/logo.png -> permis
css/../index.html -> permis
../../parole.txt -> interzis
Greșeli frecvente
- Verifici
startsWithfărănormalize:publice/../parole.txtîncepe tot cupublice, deși iese din folder. - Te aștepți ca
normalizesă urmeze legăturile simbolice sau să verifice existența. Pentru calea reală de pe disc foloseștetoRealPath().
Comenzi înrudite
Path.toAbsolutePath: Transformă o cale relativă în cale absolută, adăugând în față folderul curent al programului.Path.relativize: Calculează drumul relativ de la o cale la alta: Path.of(„a”).relativize(Path.of(„a/b/c”)) dă b/c.Path.resolve: Adaugă o cale la sfârșitul altei căi: folder.resolve(„note.txt”) dă folder/note.txt.Path: Reprezintă calea unui fișier sau folder (ex. date/note.txt); nu verifică dacă fișierul există. toString o dă ca text.