A getPath (), a getAbsolutePath () és a getCanonicalPath () összehasonlítása a Java-ban

1. Áttekintés

A java.io.Fájl osztálynak három módszere van - getPath (), getAbsolutePath () és getCanonicalPath () - a fájlrendszer elérési útjának megszerzése.

Ebben a cikkben gyorsan áttekintjük a különbségeket, és megvitatunk egy felhasználási esetet, ahol dönthet úgy, hogy a többit használja.

2. A módszer definíciói és példák

Kezdjük azzal, hogy áttekintjük a három módszer definícióit, valamint a következő könyvtárstruktúra meglévő példáit a felhasználó saját könyvtárában:

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

Egyszerűen fogalmazva, getPath () visszaadja a Húr a fájl absztrakt elérési útjának ábrázolása. Ez lényegében az az elérési út a File konstruktőr.

Tehát, ha a File objektum egy relatív elérési út felhasználásával jött létre, a getPath () módszer relatív út is lenne.

Ha a következő kódot hívjuk meg a {user.home} / baeldung Könyvtár:

Fájlfájl = új Fájl ("foo / foo-one.txt"); Karakterlánc elérési útja = file.getPath ();

A pálya változó értéke:

foo / foo-one.txt // Unix rendszereken foo \ foo-one.txt // Windows rendszereken

Figyelje meg, hogy a Windows rendszerben a névelválasztó karakter a konstruktornak átadott előre perjel (/) karakterről a backslash (\) karakterre változott. Ez azért van, mert a visszatért Húr mindig a platform alapértelmezett névelválasztó karakterét használja.

2.2. getAbsolutePath ()

A getAbsolutePath () metódus visszatér a fájl elérési útja az aktuális felhasználói könyvtár elérési útjának feloldása után - ezt abszolút útvonalnak hívják. Tehát az előző példánkhoz file.getAbsolutePath () visszatérne:

/home/username/baeldung/foo/foo-one.txt // Unix rendszereken C: \ Users \ felhasználónév \ baeldung \ foo \ foo-one.txt // Windows rendszereken

Ez a módszer csak az aktuális könyvtárat oldja fel egy relatív útvonal számára. Gyorsírásos ábrázolások (például.” és „..”) nem oldódnak meg tovább. Ezért amikor a következő kódot futtatjuk a könyvtárból {user.home} / baeldung:

File file = új File ("bar / baz /../ bar-one.txt"); Karakterlánc elérési útja = file.getAbsolutePath ();

A változó értéke pálya lenne:

/home/username/baeldung/bar/baz/../bar-one.txt // Unix rendszereken C: \ Users \ felhasználónév \ baeldung \ bar \ baz \ .. \ bar-one.txt // Windows rendszereken

2.3. getCanonicalPath ()

A getCanonicalPath () módszer egy lépéssel tovább megy, és feloldja az abszolút útvonalnevet, valamint a rövidítéseket vagy felesleges neveket, mint például.”És„.. a könyvtárstruktúra szerint. Az is feloldja a szimbolikus linkeket Unix rendszereken és konvertálja a meghajtóbetűjelet szabványos nagybetűvé Windows rendszereken.

Tehát az előző példához getCanonicalPath () módszer visszatér:

/home/username/baeldung/bar/bar-one.txt // Unix rendszereken C: \ Users \ felhasználónév \ baeldung \ bar \ bar-one.txt // Windows rendszereken

Vegyünk egy másik példát. Adva az aktuális könyvtárat $ {user.home} / baeldung és File paraméterrel létrehozott objektum új fájl („bar / baz /./ baz-one.txt”), a kimenet a getCanonicalPath () lenne:

/home/username/baeldung/bar/baz/baz-one.txt // Unix rendszereken C: \ Users \ felhasználónév \ baeldung \ bar \ baz \ baz-one.txt // Windows rendszereken

Érdemes megemlíteni, hogy egyetlen fájl a fájlrendszeren végtelen számú abszolút elérési utat tartalmazhat, mivel végtelen sokféleképpen lehet használni a rövidített ábrázolásokat. Azonban, a kanonikus út mindig egyedi lesz mivel minden ilyen képviselet megoldódott.

Az utóbbi két módszerrel ellentétben getCanonicalPath () dobhat IOException mert fájlrendszeri lekérdezéseket igényel.

Például Windows rendszereken, ha létrehozunk egy File objektumot az egyik illegális karakterrel, a kanonikus út megoldása egy IOException:

új Fájl ("*"). getCanonicalPath ();

3. Használjon esetet

Tegyük fel, hogy olyan módszert írunk, amely a File objektumot paraméterként, és teljesen minősített nevét egy adatbázisba menti. Nem tudjuk, hogy az út relatív-e vagy rövidítéseket tartalmaz-e. Ebben az esetben érdemes használni getCanonicalPath ().

Mivel azonban getCanonicalPath () elolvassa a fájlrendszert, ez teljesítményköltséggel jár. Ha biztosak vagyunk abban, hogy nincsenek redundáns nevek vagy szimbolikus hivatkozások, és a meghajtóbetűjelek szabványosítottak (ha Windows operációs rendszert használnak), akkor inkább a getAbsoultePath ().

4. Következtetés

Ebben a gyors bemutatóban kitértünk a három különbségére File módszerek a fájlrendszer elérési útjának megszerzéséhez. Bemutattunk olyan felhasználási esetet is, amikor az egyik módszer előnyben részesíthető a másikkal szemben.

A Junit a cikk példáit bemutató tesztosztály megtalálható a GitHub oldalon.