Path.normalize în Java

Simplifică o cale: elimină „.” (folderul curent) și „..” împreună cu folderul dinaintea lui.

Sintaxă
Path normalize()

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 startsWith fără normalize: publice/../parole.txt începe tot cu publice, deși iese din folder.
  • Te aștepți ca normalize să urmeze legăturile simbolice sau să verifice existența. Pentru calea reală de pe disc folosește toRealPath().

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.