Path.relativize în Java

Calculează drumul relativ de la o cale la alta: Path.of("a").relativize(Path.of("a/b/c")) dă b/c.

Sintaxă
Path relativize(Path alta)

Ce face Path.relativize

baza.relativize(tinta) răspunde la întrebarea „cum ajung din baza la tinta?”. Pentru site și site/blog/java.html rezultatul este blog/java.html; pentru drumuri care urcă, apar ...

Este inversul lui resolve: baza.resolve(baza.relativize(tinta)) dă din nou tinta. Ambele căi trebuie să fie de același fel (ambele relative sau ambele absolute), altfel se aruncă IllegalArgumentException.

Parametri

Parametru Descriere
alta Calea la care vrei să ajungi.

Ce returnează

O cale relativă de la cale la alta.

Exemple

Exemplul 1: Drumuri relative

import java.nio.file.Path;

public class Main {
    public static void main(String[] args) {
        Path site = Path.of("site");
        Path pagina = Path.of("site/blog/java.html");
        Path stil = Path.of("site/css/stil.css");

        System.out.println(site.relativize(pagina));
        System.out.println(pagina.getParent().relativize(stil));
        System.out.println(site.resolve(site.relativize(pagina)));
    }
}

Rezultat

blog/java.html
../css/stil.css
site/blog/java.html

Exemplul 2: Listare cu căi relative la folderul de start

Files.walk dă căi care încep cu backup; cu relativize le afișăm fără acest prefix.

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.stream.Stream;

public class Main {
    public static void main(String[] args) throws IOException {
        Path backup = Path.of("backup");
        Files.createDirectories(backup.resolve("poze/2026"));
        Files.writeString(backup.resolve("poze/2026/munte.jpg"), "");
        Files.writeString(backup.resolve("contacte.vcf"), "");

        try (Stream<Path> s = Files.walk(backup)) {
            s.filter(Files::isRegularFile).map(backup::relativize).sorted().forEach(System.out::println);
        }
    }
}

Rezultat

contacte.vcf
poze/2026/munte.jpg

Greșeli frecvente

  • Amesteci o cale absolută cu una relativă: IllegalArgumentException. Fă-le pe amândouă absolute cu toAbsolutePath().
  • Încurci ordinea: a.relativize(b) este drumul de la a la b, nu invers.

Comenzi înrudite

  • Path.resolve: Adaugă o cale la sfârșitul altei căi: folder.resolve(„note.txt”) dă folder/note.txt.
  • Path.normalize: Simplifică o cale: elimină „.” (folderul curent) și „..” împreună cu folderul dinaintea lui.
  • Files.walk: Parcurge un folder cu tot ce conține, la orice adâncime, și dă toate căile ca Stream<Path>, începând cu folderul însuși.
  • Path: Reprezintă calea unui fișier sau folder (ex. date/note.txt); nu verifică dacă fișierul există. toString o dă ca text.