Porovnanie getPath (), getAbsolutePath () a getCanonicalPath () v Jave

1. Prehľad

The java.io.Súbor trieda má tri metódy - getPath (), getAbsolutePath () a getCanonicalPath () - na získanie cesty k súborovému systému.

V tomto článku sa rýchlo pozrieme na rozdiely medzi nimi a rozoberieme prípad použitia, kde sa môžete rozhodnúť použiť jeden nad ostatnými.

2. Definície a príklady metód

Začnime tým, že prejdeme definície týchto troch metód spolu s príkladmi založenými na prítomnosti nasledujúcej adresárovej štruktúry v domovskom adresári používateľa:

| - 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 ()

Jednoducho povedané, getPath () vracia String reprezentácia abstraktnej cesty súboru. To je v podstate názov cesty odovzdaný Súbor konštruktér.

Takže, ak Súbor objekt bol vytvorený pomocou relatívnej cesty, vrátená hodnota z getPath () metóda by bola tiež relatívna cesta.

Ak vyvoláme nasledujúci kód z {user.home} / baeldung adresár:

File file = new File ("foo / foo-one.txt"); Reťazec path = file.getPath ();

The cesta premenná by mala hodnotu:

foo / foo-one.txt // na systémoch Unix foo \ foo-one.txt // na systémoch Windows

Všimnite si, že v systéme Windows sa znak oddeľovača mien zmenil zo znaku lomky (/), ktorý bol odovzdaný konštruktoru, na znak spätného lomítka (\). To je preto, že vrátený String vždy používa predvolený znak oddeľovača mien platformy.

2.2. getAbsolutePath ()

The getAbsolutePath () metóda sa vracia cesta k súboru po vyriešení cesty k aktuálnemu adresáru používateľov - nazýva sa to absolútny názov cesty. Pre náš predchádzajúci príklad teda file.getAbsolutePath () by sa vrátil:

/home/username/baeldung/foo/foo-one.txt // v systémoch Unix C: \ Users \ používateľské meno \ baeldung \ foo \ foo-one.txt // v systémoch Windows

Táto metóda vyrieši iba aktuálny adresár pre relatívnu cestu. Stenografické znázornenia (napríklad „.” a „..”) sa ďalej neriešia. Preto keď vykonáme nasledujúci kód z adresára {user.home} / baeldung:

File file = new File ("bar / baz /../ bar-one.txt"); Reťazec path = file.getAbsolutePath ();

Hodnota premennej cesta bolo by:

/home/username/baeldung/bar/baz/../bar-one.txt // v systémoch Unix C: \ Users \ používateľské meno \ baeldung \ bar \ baz \ .. \ bar-one.txt // v systémoch Windows

2.3. getCanonicalPath ()

The getCanonicalPath () metóda ide o krok ďalej a určuje absolútny názov cesty, ako aj skratky alebo nadbytočné názvy ako „.“A„.. podľa adresárovej štruktúry. To tiež rieši symbolické odkazy na systémoch Unix a prevedie písmeno jednotky na štandardné veľké a malé písmená v systémoch Windows.

Takže pre predchádzajúci príklad getCanonicalPath () metóda by sa vrátila:

/home/username/baeldung/bar/bar-one.txt // v systémoch Unix C: \ Users \ používateľské meno \ baeldung \ bar \ bar-one.txt // v systémoch Windows

Zoberme si ďalší príklad. Daný aktuálny adresár ako $ {user.home} / baeldung a Súbor objekt vytvorený pomocou parametra nový súbor („bar / baz /./ baz-one.txt“), výstup pre getCanonicalPath () bolo by:

/home/username/baeldung/bar/baz/baz-one.txt // v systémoch Unix C: \ Users \ používateľské meno \ baeldung \ bar \ baz \ baz-one.txt // v systémoch Windows

Za zmienku stojí, že jeden súbor v súborovom systéme môže mať nekonečný počet absolútnych ciest, pretože existuje nekonečné množstvo spôsobov, ako sa dajú použiť skratkové reprezentácie. Avšak kanonická cesta bude vždy jedinečná pretože všetky takéto vyhlásenia sú vyriešené.

Na rozdiel od posledných dvoch metód getCanonicalPath () môže hodiť Výnimka IO pretože vyžaduje dotazy na súborový systém.

Napríklad v systémoch Windows, ak vytvoríme a Súbor objekt s jedným z nepovolených znakov, vyriešenie kanonickej cesty vyvolá znak Výnimka IO:

nový súbor ("*"). getCanonicalPath ();

3. Prípad použitia

Povedzme, že píšeme metódu, ktorá zaberá a Súbor objekt ako parameter a uloží jeho plne kvalifikovaný názov do databázy. Nevieme, či je cesta relatívna alebo obsahuje skratky. V takom prípade možno budeme chcieť použiť getCanonicalPath ().

Avšak od getCanonicalPath () číta súborový systém, stojí to výkonová cena. Ak sme si istí, že neexistujú žiadne nadbytočné názvy ani symbolické odkazy a veľkosť písmen v jednotke je štandardizovaná (ak používate operačný systém Windows), mali by sme uprednostniť použitie getAbsoultePath ().

4. Záver

V tomto rýchlom návode sme sa venovali rozdielom medzi týmito tromi Súbor metódy na získanie cesty k súborovému systému. Ukázali sme tiež prípad použitia, keď môže byť uprednostnená jedna metóda pred druhou.

A Junit testovaciu triedu demonštrujúcu príklady tohto článku nájdete na GitHub.


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