1. Pathklasse

Hvis du vil skrive et program som gjør noe med filer på disk, er det ganske enkelt. Java har mange klasser som hjelper deg med å jobbe med både selve filene og innholdet deres.

Tidlige versjoner av Java brukte klasser som Fileog FileInputStreamfor å jobbe med filer. Imidlertid Fileer klassen nå utdatert og anbefales ikke brukt. Selvfølgelig kan du fortsatt støte på det i kode, metodeparametere eller klassekonstruktører.

Helt fra første stund vil vi begynne å lære hvordan vi jobber med filer ved hjelp av Pathklassen. Pather klassen som erstattet File. Det er tryggere og mer effektivt.

Pathklasse

Teknisk sett Pather det ikke en klasse - det er et grensesnitt. Dette gjøres for å tillate skriving av en etterkommer av Pathklassen for hvert operativsystem (og filsystem).

Windows har én standard for å skrive filstier, og Linux har en annen. Selvfølgelig er det mange andre operativsystemer i verden, og hver har sin egen standard.

Det er derfor Pathgrensesnittet brukes overalt i metodene som fungerer med filer, selv om arbeidet i virkeligheten skjer gjennom etterkommerklassene: WindowsPath, UnixPath, ...

Opprette et Pathobjekt

For å lage et Pathobjekt (som faktisk vil være et objekt av etterkommerklassen WindowsPath), må du bruke en uttalelse som denne:

Path name = Path.of(path);

Hvor nameer navnet på en Pathvariabel, og pather banen til filen (eller katalogen) inkludert navnet på filen (eller katalogen). Og ofer en statisk metode for Pathklassen.

Metoden of()brukes til å lage WindowsPathobjekter hvis programmet kjører på Windows. Hvis programmet kjører på Linux, UnixPathopprettes objekter. Du kan ikke opprette et Pathobjekt ved å bruke kode som .new Path()

Eksempler:

Kode Merk
Path file = Path.of("c:\\projects\\note.txt");
Banen til filen
Path directory = Path.of("c:\\projects\\");
Sti til katalogen

Filen (eller katalogen) trenger ikke å eksistere for at et gyldig Pathobjekt skal eksistere. Kanskje du bare vil lage en fil... Et Pathobjekt er som en oppsummert String: det er ikke knyttet til en bestemt fil på disken - det lagrer bare en bestemt bane på disken. Det er det.


2. Metoder av Pathtypen

Grensesnittet Pathhar ganske mange interessante metoder. De mest interessante er presentert i tabellen nedenfor.

Metode Beskrivelse
Path getParent()
Returnerer den overordnede katalogen
Path getFileName()
Returnerer filnavnet uten katalogen
Path getRoot()
Returnerer rotkatalogen fra en bane
boolean isAbsolute()
Sjekker om gjeldende bane er absolutt
Path toAbsolutePath()
Konverterer banen til absolutt
Path normalize()
Fjerner jokertegn i et katalognavn.
Path resolve(Path other)
Konstruerer en ny absolutt bane fra absolutte og relative baner.
Path relativize(Path other)
Får en relativ bane fra to absolutte baner.
boolean startsWith(Path other)
Sjekker om gjeldende sti starter med en gitt bane
boolean endsWith(Path other)
Sjekker om gjeldende bane slutter med en gitt bane
int getNameCount()
Deler opp banen i deler ved å bruke /som skilletegn.
Returnerer antall deler.
Path getName(int index)
Deler opp banen i deler ved å bruke /som skilletegn.
Returnerer en del etter sin indeks.
Path subpath(int beginIndex, int endIndex)
Deler opp banen i deler ved å bruke /som skilletegn.
Returnerer underbanen som tilsvarer det gitte intervallet.
File toFile()
Konverterer et Pathobjekt til et utdatert Fileobjekt
URI toUri()
Konverterer et Pathobjekt til et URIobjekt

Nedenfor er en kort beskrivelse av eksisterende metoder.


3. Dele en sti i deler

Metoden getParent()returnerer banen som peker til overordnet katalog for gjeldende bane. Uansett om denne banen er en katalog eller en fil:

Kode Verdi
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

Metoden getFileName()returnerer et enkelt fil (eller katalog) navn - hva som kommer etter det siste skilletegnet:

Kode Verdi
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

Metoden getRoot()returnerer banen til rotkatalogen:

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


4. Absolutte og relative veier

Det er to typer veier: absolutt og relativ. En absolutt bane starter fra rotkatalogen. For Windows kan dette være c:\mappen; for Linux — /katalogen

En relativ bane er meningsfull i forhold til en katalog. Det vil si at det er som slutten på veien, men uten begynnelsen. Du kan gjøre en relativ bane til en absolutt bane og omvendt

boolean isAbsolute()metode

Metoden sjekker om gjeldende bane er absolutt

Kode Verdi
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()metode

Konverterer banen til absolutt. Om nødvendig legger du til den gjeldende arbeidskatalogen:

Kode Verdi
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()metode

I banen, i stedet for et katalognavn, kan du skrive "..", som betyr gå én katalog tilbake . Normalisering eliminerer disse tingene. Eksempler:

Kode Verdi
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)metode

Metoden relativize()lar deg konstruere "forskjellene mellom baner": en bane i forhold til en annen

Kode Verdi
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);
UlovligArgumentUnntak:
de to banene har en annen "root" (forskjellige disker)

Path resolve(Path other)metode

Metoden resolve()gjør det motsatte av relativize(): den bygger en ny absolutt vei fra en absolutt og en relativ vei.

Kode Verdi
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()metode

Metoden returnerer et utdatert Fileobjekt som lagrer samme filbane som Pathobjektet.

toURI()metode

Metoden konverterer banen til en standard URI , og returnerer et objekt som inneholder banen til filen:

Banen til filen URI til filen
c:\windows\projects\note.txt
file:///c:/windows/projects/note.txt