Java NIO2 Path API

1. Oversigt

I denne artikel lærer vi, hvordan du bruger den nye I / O (NIO2) Sti API i Java.

Det Sti API'er i NIO2 udgør et af de store nye funktionelle områder, der blev leveret med Java 7 og specifikt en delmængde af det nye filsystem API sammen med File API'er.

2. Opsætning

NIO2-supporten er samlet i java.nio.file pakke. Så opsæt dit projekt til at bruge Sti API'er er bare et spørgsmål om at importere alt i denne pakke:

import java.nio.file. *;

Da kodeprøverne i denne artikel sandsynligvis kører i forskellige miljøer, lad os få fat i brugerens hjemmekatalog:

privat statisk streng HOME = System.getProperty ("user.home");

Denne variabel peger på en gyldig placering i ethvert miljø.

Det Stier klasse er hovedindgangsstedet for alle operationer, der involverer filsystemstier. Det giver os mulighed for at oprette og manipulere stier til filer og mapper.

Værd at bemærke er, at stioperationer hovedsagelig er syntaktiske; de har ingen indvirkning på det underliggende filsystem, og heller ikke filsystemet har nogen indflydelse på, om de lykkes eller mislykkes. Dette betyder, at overføring af en ikke-eksisterende sti som en parameter for en stioperation ikke har nogen indflydelse på, om den lykkes eller mislykkes.

3. Stioperationer

I dette afsnit introducerer vi den vigtigste syntaks, der bruges i stioperationer. Som navnet antyder, er Sti klasse er en programmatisk repræsentation af en sti i filsystemet.

EN Sti objektet indeholder filnavnet og kataloglisten, der bruges til at konstruere stien, og bruges til at undersøge, lokalisere og manipulere filer.

Hjælperklassen, java.nio.file Stier (i flertalsform) er den formelle måde at skabe på Sti genstande. Det har to statiske metoder til oprettelse af en Sti fra en stisnor:

Sti sti = Paths.get ("sti streng");

Uanset om vi bruger en fremad eller tilbageslag i stien Snor, betyder ikke noget, API løser denne parameter i overensstemmelse med det underliggende filsystems krav.

Og fra en java.net.URI objekt:

Sti sti = Paths.get (URI-objekt);

Vi kan nu gå videre og se disse i aktion.

4. Oprettelse af en sti

Til lave en Sti objekt fra en stisnor:

@Test offentlig ugyldighed givenPathString_whenCreatesPathObject_thenCorrect () {Path p = Paths.get ("/ articles / baeldung"); assertEquals ("\ artikler \ baeldung", p.toString ()); }

Det API kan tage en variabelargumentparameter af stistrengdele (i dette tilfælde artikler og baeldung) ud over den første del (i dette tilfælde artikler).

Hvis vi leverer disse dele i stedet for en komplet stistreng, vil de blive brugt til at konstruere stienobjektet, vi behøver ikke at medtage navneseparatorerne (skråstreger) i delen med variable argumenter:

@Test offentlig ugyldighed givenPathParts_whenCreatesPathObject_thenCorrect () {Path p = Paths.get ("/ articles", "baeldung"); assertEquals ("\ artikler \ baeldung", p.toString ()); }

5. Hentning af stiinformation

Du kan tænke på sti-objektet som navneelementer som en sekvens. En vej Snor såsom E: \ baeldung \ articles \ java består af tre navneelementer, dvs. baeldung, artiklerog java. Det højeste element i katalogstrukturen vil være placeret i indeks 0, i dette tilfælde baeldung.

Det laveste element i katalogstrukturen vil være placeret i indekset [n-1], hvor n er antallet af navnelementer i stien. Dette laveste element kaldes filnavn uanset om det er en egentlig fil eller ej:

@Test offentligt ugyldigt givenPath_whenRetrievesFileName_thenCorrect () {Path p = Paths.get ("/ articles / baeldung / logs"); Sti filnavn = p.getFileName (); assertEquals ("logs", fileName.toString ()); }

Metoder er tilgængelige til at hente individuelle elementer efter indeks:

@Test offentlig ugyldighed givenPath_whenRetrievesNameByIndex_thenCorrect () {Path p = Paths.get ("/ articles / baeldung / logs"); Sti navn0 = getName (0); Sti navn1 = getName (1); Sti navn2 = getName (2); assertEquals ("artikler", name0.toString ()); assertEquals ("baeldung", name1.toString ()); assertEquals ("logs", name2.toString ()); }

eller en undersekvens af stien ved hjælp af disse indeksområder:

@Test offentligt ugyldigt givenPath_whenCanRetrieveSubsequenceByIndex_thenCorrect () {Path p = Paths.get ("/ articles / baeldung / logs"); Sti substi1 = p.substi (0,1); Sti subPath2 = p.subpath (0,2); assertEquals ("artikler", subPath1.toString ()); assertEquals ("artikler \ baeldung", subPath2.toString ()); assertEquals ("artikler \ baeldung \ logs", s.subpath (0, 3) .toString ()); assertEquals ("baeldung", s.subpath (1, 2) .toString ()); assertEquals ("baeldung \ logs", s.subpath (1, 3) .toString ()); assertEquals ("logs", s.subpath (2, 3) .toString ()); }

Hver sti er knyttet til en forældresti eller nul hvis stien ikke har nogen forælder. Overordnet til et stiobjekt består af stiens rodkomponent, hvis nogen, og hvert element i stien bortset fra filnavnet. Som et eksempel, forældrestien til / a / b / c er / a / b og den af /en er nul:

@Test offentligt ugyldigt givenPath_whenRetrievesParent_thenCorrect () {Path p1 = Paths.get ("/ articles / baeldung / logs"); Sti p2 = Paths.get ("/ artikler / baeldung"); Sti p3 = Paths.get ("/ artikler"); Sti p4 = Paths.get ("/"); Sti forælder1 = p1.getParent (); Sti forælder2 = p2.getParent (); Sti parent3 = p3.getParent (); Sti parent4 = p4.getParenth (); assertEquals ("\ artikler \ baeldung", parent1.toString ()); assertEquals ("\ artikler", parent2.toString ()); assertEquals ("\", parent3.toString ()); assertEquals (null, parent4); }

Vi kan også få rodelementet på en sti:

@Test offentligt ugyldigt givenPath_whenRetrievesRoot_thenCorrect () {Path p1 = Paths.get ("/ articles / baeldung / logs"); Sti p2 = Paths.get ("c: / articles / baeldung / logs"); Sti rod1 = p1.getRoot (); Sti root2 = p2.getRoot (); assertEquals ("\", root1.toString ()); assertEquals ("c: \", root2.toString ()); }

6. Normalisering af en sti

Mange filsystemer bruger “.” notation for at betegne den aktuelle mappe og “..” for at betegne den overordnede mappe. Du kan have en situation, hvor en sti indeholder overflødige biblioteksoplysninger.

Overvej for eksempel følgende kurstrenge:

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

De løser alle samme sted / baeldung / artikler. De to første har afskedigelser, mens den sidste ikke har det.

Normalisering af en sti indebærer fjernelse af afskedigelser i den. Det Sti. Normalisere () betjening til dette formål.

Dette eksempel skal nu være selvforklarende:

@Test offentligt ugyldigt givenPath_whenRemovesRedundancies_thenCorrect1 () {Path p = Paths.get ("/ home /./ baeldung / articles"); Sti cleanPath = p.normalize (); assertEquals ("\ hjem \ baeldung \ artikler", cleanPath.toString ()); }

Denne også:

@Test offentlig ugyldighed givenPath_whenRemovesRedundancies_thenCorrect2 () {Path p = Paths.get ("/ home / baeldung /../ articles"); Sti cleanPath = p.normaliser (); assertEquals ("\ hjem \ artikler", cleanPath.toString ()); }

7. Konvertering af sti

Der er handlinger til at konvertere en sti til et valgt præsentationsformat. For at konvertere en sti til en streng, der kan åbnes fra browseren, bruger vi toUri metode:

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

Vi kan også konvertere en sti til dens absolutte repræsentation. Det tilAbsolutePath metode løser en sti mod et filsystems standardkatalog:

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

Når stien, der skal løses, imidlertid registreres for at være absolut, returnerer metoden den som den er:

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

Vi kan også konvertere enhver sti til dens virkelige ækvivalent ved at ringe til toRealPath metode. Denne metode forsøger at løse stien ved at kortlægge dens elementer til faktiske mapper og filer i filsystemet.

Tid til at bruge den variabel, vi oprettede i Opsætning sektion, der peger på den indloggede brugers hjemmeplacering i filsystemet:

@Test offentlig ugyldighed givenExistingPath_whenGetsRealPathToFile_thenCorrect () {Path p = Paths.get (HOME); Sti realPath = p.toRealPath (); assertEquals (HOME, realPath.toString ()); }

Ovenstående test fortæller os ikke rigtig meget om opførelsen af ​​denne operation. Det mest oplagte resultat er, at hvis stien ikke findes i filsystemet, vil operationen kaste et IOUndtagelse, Læs videre.

På grund af manglen på en bedre måde at køre dette punkt hjem, skal du bare se på den næste test, der forsøger at konvertere en ikke-eksisterende sti til en reel sti:

@Test (forventet = NoSuchFileException.class) offentlig ugyldighed givenInExistentPath_whenFailsToConvert_thenCorrect () {Path p = Paths.get ("E: \ home \ baeldung \ articles.html"); p.toRealPath (); }

Testen lykkes, når vi fanger en IOUndtagelse. Den egentlige underklasse af IOUndtagelse som denne operation kaster er NoSuchFileException.

8. Tilslutning af stier

Sammenføjning af to stier kan opnås ved hjælp af beslutte metode.

Kort sagt, vi kan ringe til beslutte metode på enhver Sti og videregive en delvis sti som argumentet. Denne delvise sti føjes til den oprindelige sti:

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

Når stien strengen gik til beslutte metoden er ikke en delvis sti især en absolut sti, så returneres den indleverede sti:

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

Den samme ting sker med enhver sti, der har et rodelement. Stien strengen “Java” har intet rodelement, mens kurven er streng “/ Java” har et rodelement. Derfor, når du passerer en sti med et rodelement, returneres det som det er:

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

9. Relativisering Stier

Begrebet relativisere betyder simpelthen at skabe en direkte sti mellem to kendte stier. For eksempel, hvis vi har et bibliotek / baeldung og inde i det har vi to andre mapper sådan / baeldung / forfattere og / baeldung / artikler er gyldige stier.

Vejen til artikler i forhold til forfattere ville blive beskrevet som “Flytte et niveau op i kataloghierarkiet og derefter ind i artiklenes katalog” eller ..\artikler:

@Test offentligt ugyldigt givenSiblingPaths_whenCreatesPathToOther_thenCorrect () {Path p1 = Paths.get ("artikler"); Sti p2 = Paths.get ("forfattere"); Sti p1_rel_p2 = p1.relativize (p2); Sti p2_rel_p1 = p2.relativize (p1); assertEquals (".. \ forfattere", p1_rel_p2.toString ()); assertEquals (".. \ artikler", p2_rel_p1.toString ()); }

Forudsat at vi flytter artikler mappe til forfattere mappe sådan at de ikke længere er søskende. Følgende relativiserende operationer involverer at skabe en sti imellem baeldung og artikler og omvendt:

@Test offentlig ugyldighed givenNonSiblingPaths_whenCreatesPathToOther_thenCorrect () {Path p1 = Paths.get ("/ baeldung"); Sti p2 = Paths.get ("/ baeldung / forfattere / artikler"); Sti p1_rel_p2 = p1.relativize (p2); Sti p2_rel_p1 = p2. Relative (p1); assertEquals ("forfattere \ artikler", p1_rel_p2.toString ()); assertEquals (".. \ ..", p2_rel_p1.toString ()); }

10. Sammenligning af stier

Det Sti klasse har en intuitiv implementering af lige med metode, der gør det muligt for os at sammenligne to veje for lighed:

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

Du kan også kontrollere, om en sti begynder med en given streng:

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

Eller slutter med en anden streng:

@Test offentligt ugyldigt givenPath_whenInspectsEnd_thenCorrect () {Path p1 = Paths.get ("/ baeldung / articles"); assertTrue (p1.endsWith ("artikler")); }

11. Konklusion

I denne artikel viste vi stioperationer i det nye filsystem API (NIO2), der blev sendt som en del af Java 7 og så de fleste af dem i aktion.

Kodeprøverne, der bruges i denne artikel, kan findes i artiklens Github-projekt.


$config[zx-auto] not found$config[zx-overlay] not found