Sammenligning av getPath (), getAbsolutePath () og getCanonicalPath () i Java

1. Oversikt

De java.io. fil klassen har tre metoder - getPath (), getAbsolutePath () og getCanonicalPath () - for å få tak i filsystembanen.

I denne artikkelen tar vi en rask titt på forskjellene mellom dem og diskuterer en brukssak der du kan velge å bruke en fremfor de andre.

2. Metodedefinisjoner og eksempler

La oss starte med å gå over definisjonene av de tre metodene, sammen med eksempler basert på at følgende katalogstruktur er til stede i brukerens hjemmekatalog:

| - baeldung | - baeldung.txt | - foo | | - foo-one.txt | \ - foo-two.txt \ - bar | - bar-one.txt | - bar-two.txt \ - baz | - baz-one.txt \ - baz-two.txt

2.1. getPath ()

For å si det enkelt, getPath () returnerer String representasjon av filens abstrakte stinavn. Dette er egentlig stienavnet ble sendt til Fil konstruktør.

Så hvis Fil objektet ble opprettet ved hjelp av en relativ bane, den returnerte verdien fra getPath () metoden vil også være en relativ bane.

Hvis vi påkaller følgende kode fra {user.home} / baeldung katalog:

Filfil = ny fil ("foo / foo-one.txt"); Strengsti = file.getPath ();

De sti variabel ville ha verdien:

foo / foo-one.txt // på Unix-systemer foo \ foo-one.txt // på Windows-systemer

Legg merke til at for Windows-systemet har navnet-skilletegnet endret seg fra fremover skråstrek (/) -tegnet, som ble sendt til konstruktøren, til tilbakeslagstegn (\). Dette er fordi de returnerte String bruker alltid plattformens standard navn-skilletegn.

2.2. getAbsolutePath ()

De getAbsolutePath () metoden returnerer stienavnet til filen etter å ha løst banen for gjeldende brukerkatalog - dette kalles et absolutt stienavn. Så for vårt forrige eksempel, file.getAbsolutePath () ville komme tilbake:

/home/username/baeldung/foo/foo-one.txt // på Unix-systemer C: \ Brukere \ brukernavn \ baeldung \ foo \ foo-one.txt // på Windows-systemer

Denne metoden løser bare den nåværende katalogen for en relativ bane. Korthandsrepresentasjoner (for eksempel “.” og “..”) blir ikke løst videre. Derfor når vi utfører følgende kode fra katalogen {user.home} / baeldung:

Filfil = ny fil ("bar / baz /../ bar-one.txt"); Strengsti = file.getAbsolutePath ();

Verdien på variabelen sti ville vært:

/home/username/baeldung/bar/baz/../bar-one.txt // på Unix-systemer C: \ Brukere \ brukernavn \ baeldung \ bar \ baz \ .. \ bar-one.txt // på Windows-systemer

2.3. getCanonicalPath ()

De getCanonicalPath () metoden går et skritt videre og løser det absolutte stienavnet i tillegg til stenografi eller overflødige navn som “.”Og”.. i henhold til katalogstrukturen. Det også løser symbolske lenker på Unix-systemer og konverterer stasjonsbokstaven til en standard sak på Windows-systemer.

Så for det forrige eksemplet, getCanonicalPath () metoden ville returnere:

/home/username/baeldung/bar/bar-one.txt // på Unix-systemer C: \ Brukere \ brukernavn \ baeldung \ bar \ bar-one.txt // på Windows-systemer

La oss ta et annet eksempel. Gitt gjeldende katalog som $ {user.home} / baeldung og Fil objekt opprettet ved hjelp av parameteren ny fil (“bar / baz /./ baz-one.txt”), utgangen for getCanonicalPath () ville vært:

/home/username/baeldung/bar/baz/baz-one.txt // på Unix-systemer C: \ Brukere \ brukernavn \ baeldung \ bar \ baz \ baz-one.txt // på Windows-systemer

Det er verdt å nevne at en enkelt fil i filsystemet kan ha et uendelig antall absolutte baner, siden det er et uendelig antall måter stenografiske representasjoner kan brukes. Derimot, den kanoniske stien vil alltid være unik siden alle slike representasjoner er løst.

I motsetning til de to siste metodene, getCanonicalPath () kan kaste IO Unntak fordi det krever filsystemspørsmål.

For eksempel på Windows-systemer, hvis vi oppretter en Fil objekt med en av de ulovlige karakterene, å løse den kanoniske banen vil kaste en IO Unntak:

ny fil ("*"). getCanonicalPath ();

3. Bruk sak

La oss si at vi skriver en metode som tar inn a Fil objekt som parameter og lagrer det fullt kvalifiserte navnet i en database. Vi vet ikke om banen er relativ eller inneholder stenografi. I dette tilfellet vil vi kanskje bruke getCanonicalPath ().

Imidlertid siden getCanonicalPath () leser filsystemet, koster det ytelse. Hvis vi er sikre på at det ikke er overflødige navn eller symbolske lenker og stasjonsbokstavsaken er standardisert (hvis du bruker et Windows-operativsystem), bør vi foretrekke å bruke getAbsoultePath ().

4. Konklusjon

I denne raske opplæringen dekket vi forskjellene mellom de tre Fil metoder for å få filsystemsti. Vi har også vist en brukstilfelle der en metode kan være å foretrekke fremfor den andre.

EN Junit testklasse som demonstrerer eksemplene i denne artikkelen, kan du finne på GitHub.


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