Java NIO2 Path API

1. Pregled

U ovom ćemo članku naučiti kako koristiti novi I / O (NIO2) Staza API u Javi.

The Staza API-ji u NIO2 čine jedno od glavnih novih funkcionalnih područja koja se isporučuju s Javom 7, a posebno podskup novog API-ja datotečnog sustava uz File API-je.

2. Postavljanje

Podrška za NIO2 nalazi se u paketu java.nio.file paket. Dakle, postavljanje vašeg projekta za upotrebu Staza API-ji su samo stvar uvoza svega u ovom paketu:

import java.nio.file. *;

Budući da će se uzorci koda u ovom članku vjerojatno izvoditi u različitim okruženjima, uzmimo ručku u početnom direktoriju korisnika:

privatni statički niz HOME = System.getProperty ("user.home");

Ova će varijabla ukazivati ​​na važeće mjesto u bilo kojem okruženju.

The Staze klasa je glavna ulazna točka za sve operacije koje uključuju staze datotečnog sustava. Omogućuje nam stvaranje i manipulaciju stazama do datoteka i direktorija.

Vrijedno pažnje je da su operacije puta uglavnom sintaktičke prirode; oni nemaju utjecaja na temeljni datotečni sustav, a niti datotečni sustav utječe na to hoće li uspjeti ili ne. To znači da dodavanje nepostojeće putanje kao parametra operacije puta nema utjecaja na to uspije li ili ne.

3. Operacije putanje

U ovom ćemo odjeljku predstaviti glavnu sintaksu koja se koristi u operacijama putanje. Kao što mu samo ime govori, Staza class je programski prikaz staze u datotečnom sustavu.

A Staza objekt sadrži naziv datoteke i popis direktorija koji se koriste za konstrukciju staze i koristi se za ispitivanje, lociranje i manipulaciju datotekama.

Klasa pomoćnika, java.nio.file.Paths (u množini) formalni je način stvaranja Staza predmeta. Ima dvije statičke metode za stvaranje a Staza iz niza putanje:

Put puta = Paths.get ("niz puta");

Bez obzira koristimo li naprijed kosu crtu ili kosu crtu na cesti Niz, nije važno, API rješava ovaj parametar prema osnovnim zahtjevima datotečnog sustava.

I iz a java.net.URI objekt:

Put puta = Paths.get (URI objekt);

Sada možemo ići naprijed i vidjeti ih na djelu.

4. Stvaranje puta

Do stvoriti Staza objekt iz niza putanje:

@Test javna praznina givenPathString_whenCreatesPathObject_thenCorrect () {Path p = Paths.get ("/ articles / baeldung"); assertEquals ("\ članci \ baeldung", p.toString ()); }

The dobiti API može uzeti parametar varijabilnih argumenata dijelova niza puta (u ovom slučaju, članaka i baeldung) uz prvi dio (u ovom slučaju, članaka).

Ako pružimo ove dijelove umjesto cjelovitog niza putanje, oni će se koristiti za izgradnju objekta Path, ne trebamo uključiti razdvajače imena (kose crte) u dio varijabilnih argumenata:

@Test javna praznina givenPathParts_whenCreatesPathObject_thenCorrect () {Path p = Paths.get ("/ articles", "baeldung"); assertEquals ("\ članci \ baeldung", p.toString ()); }

5. Dohvaćanje podataka o putu

Objekt Path možete zamisliti kao elemente imena kao niz. Put Niz kao što su E: \ baeldung \ articles \ java sastoji se od tri elementa imena tj. baeldung, članaka, i Java. Najviši element u strukturi direktorija nalazio bi se na indeksu 0, u ovom slučaju baeldung.

Najniži element u strukturi direktorija nalazio bi se u indeksu [n-1], gdje n je broj elemenata imena na putanji. Ovaj najniži element naziva se naziv datoteke bez obzira radi li se o stvarnoj datoteci ili ne:

@Test javna praznina givenPath_whenRetrievesFileName_thenCorrect () {Path p = Paths.get ("/ articles / baeldung / logs"); Ime datoteke datoteke = p.getFileName (); assertEquals ("zapisnici", fileName.toString ()); }

Dostupne su metode za dohvaćanje pojedinih elemenata indeksom:

@Test javna praznina givenPath_whenRetrievesNameByIndex_thenCorrect () {Path p = Paths.get ("/ articles / baeldung / logs"); Naziv puta0 = getName (0); Naziv puta1 = getName (1); Ime puta2 = getName (2); assertEquals ("članci", name0.toString ()); assertEquals ("baeldung", name1.toString ()); assertEquals ("zapisnici", name2.toString ()); }

ili pod-slijed staze pomoću ovih raspona indeksa:

@Test javna praznina givenPath_whenCanRetrieveSubsequenceByIndex_thenCorrect () {Path p = Paths.get ("/ articles / baeldung / logs"); Potputa putanje1 = p.supath (0,1); Potputa staze2 = p.supath (0,2); assertEquals ("članci", subPath1.toString ()); assertEquals ("articles \ baeldung", subPath2.toString ()); assertEquals ("articles \ baeldung \ logs", p.subpath (0, 3) .toString ()); assertEquals ("baeldung", p.subpath (1, 2) .toString ()); assertEquals ("baeldung \ logs", p.subpath (1, 3) .toString ()); assertEquals ("zapisnici", p.subpath (2, 3) .toString ()); }

Svaka je staza povezana s roditeljskom stazom ili null ako staza nema roditelja. Roditelj objekta puta sastoji se od korijenske komponente puta, ako postoji, i svakog elementa na putu, osim imena datoteke. Kao primjer, nadređeni put / a / b / c je / a / b i to od / a je null:

@Test javna praznina givenPath_whenRetrievesParent_thenCorrect () {Path p1 = Paths.get ("/ articles / baeldung / logs"); Put p2 = Paths.get ("/ articles / baeldung"); Put p3 = Paths.get ("/ članci"); Put p4 = Putovi.get ("/"); Put roditelj1 = p1.getParent (); Put roditelja2 = p2.getParent (); Put roditelj3 = p3.getParent (); Put roditelja4 = p4.getParenth (); assertEquals ("\ članci \ baeldung", nadređeni1.toString ()); assertEquals ("\ članci", nadređeni2.toString ()); assertEquals ("\", parent3.toString ()); assertEquals (null, parent4); }

Također možemo dobiti korijenski element puta:

@Test javna praznina givenPath_whenRetrievesRoot_thenCorrect () {Path p1 = Paths.get ("/ articles / baeldung / logs"); Put p2 = Paths.get ("c: / articles / baeldung / logs"); Korijen puta1 = p1.getRoot (); Korijen puta2 = p2.getRoot (); assertEquals ("\", root1.toString ()); assertEquals ("c: \", root2.toString ()); }

6. Normalizacija puta

Mnogi datotečni sustavi koriste “.” notacija za označavanje trenutnog direktorija i “..” za označavanje nadređenog direktorija. Možda imate situaciju da staza sadrži suvišne informacije iz direktorija.

Na primjer, uzmite u obzir sljedeće nizove puta:

/baeldung/./articles /baeldung/authors/../articles / baeldung / articles

Svi se rješavaju na istom mjestu / baeldung / članci. Prva dva imaju viškove, dok posljednja nema.

Normalizacija puta uključuje uklanjanje viškova u njoj. The Path.normalize () operacija je predviđena u tu svrhu.

Ovaj bi primjer sada trebao biti samorazumljiv:

@Test javna praznina givenPath_whenRemovesRedundancies_thenCorrect1 () {Path p = Paths.get ("/ home /./ baeldung / articles"); Put cleanPath = p.normalize (); assertEquals ("\ home \ baeldung \ članci", cleanPath.toString ()); }

I ovaj:

@Test javna praznina givenPath_whenRemovesRedundancies_thenCorrect2 () {Path p = Paths.get ("/ home / baeldung /../ articles"); Put cleanPath = p.normalize (); assertEquals ("\ home \ članci", cleanPath.toString ()); }

7. Pretvorba puta

Postoje operacije pretvaranja puta u odabrani format prezentacije. Za pretvaranje bilo koje staze u niz koji se može otvoriti iz preglednika koristimo toUri metoda:

@Test javna praznina givenPath_whenConvertsToBrowseablePath_thenCorrect () {Path p = Paths.get ("/ home / baeldung / articles.html"); URI uri = p.toUri (); assertEquals ("datoteka: /// E: /home/baeldung/articles.html", uri.toString ()); }

Put također možemo pretvoriti u njegov apsolutni prikaz. The toAbsolutePath metoda rješava putanju prema zadanom direktoriju datotečnog sustava:

@Test javna praznina givenPath_whenConvertsToAbsolutePath_thenCorrect () {Path p = Paths.get ("/ home / baeldung / articles.html"); Put absPath = p.toAbsolutePath (); assertEquals ("E: \ home \ baeldung \ articles.html", absPath.toString ()); }

Međutim, kada se utvrdi da je put koji treba riješiti već apsolutni, metoda ga vraća onakvog kakav jest:

@Test javna praznina givenAbsolutePath_whenRetainsAsAbsolute_thenCorrect () {Path p = Paths.get ("E: \ home \ baeldung \ articles.html"); Put absPath = p.toAbsolutePath (); assertEquals ("E: \ home \ baeldung \ articles.html", absPath.toString ()); }

Također možemo pretvoriti bilo koji put u njegov stvarni ekvivalent pozivanjem znaka toRealPath metoda. Ova metoda pokušava riješiti put preslikavanjem svojih elemenata u stvarne direktorije i datoteke u datotečnom sustavu.

Vrijeme je za korištenje varijable koju smo stvorili u Postaviti odjeljak koji upućuje na kućno mjesto prijavljenog korisnika u datotečnom sustavu:

@Test javna praznina givenExistingPath_whenGetsRealPathToFile_thenCorrect () {Path p = Paths.get (HOME); Put realPath = p.toRealPath (); assertEquals (HOME, realPath.toString ()); }

Gornji test nam zapravo ne govori puno o ponašanju ove operacije. Najočitiji je rezultat da, ako staza ne postoji u datotečnom sustavu, tada će operacija baciti IOException, nastavi čitati.

U nedostatku boljeg načina da se ova točka odveze kući, samo pogledajte sljedeći test koji pokušava pretvoriti nepostojeći put u pravi put:

@Test (očekuje se = NoSuchFileException.class) javna praznina givenInExistentPath_whenFailsToConvert_thenCorrect () {Path p = Paths.get ("E: \ home \ baeldung \ articles.html"); p.toRealPath (); }

Test uspije kada uhvatimo IOException. Stvarni podrazred IOException koju ova operacija baca je NoSuchFileException.

8. Spajanje staza

Spajanje bilo koja dva puta može se postići pomoću odlučnost metoda.

Jednostavno rečeno, možemo nazvati odlučnost metoda na bilo kojem Staza i proći u a djelomični put kao argument. Taj se djelomični put dodaje izvornom putu:

@Test javna praznina givenTwoPaths_whenJoinsAndResolves_thenCorrect () {Path p = Paths.get ("/ baeldung / articles"); Put p2 = p.resolve ("java"); assertEquals ("\ baeldung \ articles \ java", p2.toString ()); }

Međutim, kada je niz puta prešao na odlučnost metoda nije a djelomični put; najvažnije apsolutni put, a zatim se vraća preneseni put:

@Test javna praznina givenAbsolutePath_whenResolutionRetainsIt_thenCorrect () {Path p = Paths.get ("/ baeldung / articles"); Put p2 = p.resolve ("C: \ baeldung \ articles \ java"); assertEquals ("C: \ baeldung \ articles \ java", p2.toString ()); }

Ista se stvar događa s bilo kojom stazom koja ima korijenski element. Niz putanje "Java" nema korijenski element dok je niz staze "/Java" ima korijenski element. Stoga, kada prođete stazu s korijenskim elementom, ona se vraća takva kakva jest:

@Test javna praznina givenPathWithRoot_whenResolutionRetainsIt_thenCorrect2 () {Path p = Paths.get ("/ baeldung / articles"); Put p2 = p.resolve ("/ java"); assertEquals ("\ java", p2.toString ()); }

9. Relativizirajući Staze

Uvjet relativizirajući jednostavno znači stvaranje izravnog puta između dva poznata puta. Na primjer, ako imamo direktorij / baeldung a u njemu imamo još dva takva vodiča / baeldung / autori i / baeldung / članci su valjane staze.

Put do članaka u odnosu na autori bi se opisao kao “Pomaknite se za jednu razinu više u hijerarhiji direktorija, a zatim u direktorij članaka” ili .. \ članci:

@Test javna praznina givenSiblingPaths_whenCreatesPathToOther_thenCorrect () {Path p1 = Paths.get ("articles"); Put p2 = Paths.get ("autori"); Put p1_rel_p2 = p1.relativize (p2); Put p2_rel_p1 = p2.relativize (p1); assertEquals (".. \ autori", p1_rel_p2.toString ()); assertEquals (".. \ članci", p2_rel_p1.toString ()); }

Pod pretpostavkom da premjestimo članaka imenik u autori mapu takvu da više nisu braća i sestre. Sljedeće relativizirajuće operacije uključuju stvaranje puta između baeldung i članaka i obrnuto:

@Test javna praznina givenNonSiblingPaths_whenCreatesPathToOther_thenCorrect () {Path p1 = Paths.get ("/ baeldung"); Put p2 = Paths.get ("/ baeldung / autori / članci"); Put p1_rel_p2 = p1.relativize (p2); Put p2_rel_p1 = p2.relativize (p1); assertEquals ("autori \ članci", p1_rel_p2.toString ()); assertEquals (".. \ ..", p2_rel_p1.toString ()); }

10. Usporedba staza

The Staza razred ima intuitivnu implementaciju jednako metoda koja nam omogućuje usporedbu dva puta za jednakost:

@Test javna praznina givenTwoPaths_whenTestsEquality_thenCorrect () {Path p1 = Paths.get ("/ baeldung / articles"); Put p2 = Paths.get ("/ baeldung / articles"); Put p3 = Paths.get ("/ baeldung / author"); assertTrue (p1.equals (p2)); assertFalse (p1.equals (p3)); }

Također možete provjeriti započinje li put zadanim nizom:

@Test javna praznina givenPath_whenInspectsStart_thenCorrect () {Path p1 = Paths.get ("/ baeldung / articles"); assertTrue (p1.startsWith ("/ baeldung")); }

Ili završava nekim drugim nizom:

@Test javna praznina givenPath_whenInspectsEnd_thenCorrect () {Path p1 = Paths.get ("/ baeldung / articles"); assertTrue (p1.endsWith ("članci")); }

11. Zaključak

U ovom smo članku prikazali Path operacije u novom API-ju datotečnog sustava (NIO2) koji je isporučen kao dio Jave 7 i vidio je da je većina njih u akciji.

Uzorci koda korišteni u ovom članku mogu se naći u članku u projektu Github.