Usporedba getPath (), getAbsolutePath () i getCanonicalPath () u Javi

1. Pregled

The java.io.Datoteka razred ima tri metode - getPath (), getAbsolutePath () i getCanonicalPath () - za dobivanje putanje datotečnog sustava.

U ovom ćemo članku na brzinu razmotriti razlike među njima i raspraviti slučaj upotrebe u kojem biste mogli odabrati jedan umjesto ostalih.

2. Definicije i primjeri metoda

Krenimo od prolaska kroz definicije triju metoda, zajedno s primjerima koji se temelje na tome da sljedeća struktura direktorija bude prisutna u korisnikovom početnom direktoriju:

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

Jednostavno rečeno, getPath () vraća Niz prikaz apstraktnog naziva puta datoteke. Ovo je u biti ime staze preneseno na Datoteka konstruktor.

Dakle, ako je Datoteka objekt je stvoren pomoću relativne staze, vraćena vrijednost iz getPath () metoda bi također bila relativan put.

Ako pozivamo sljedeći kod iz {user.home} / baeldung imenik:

Datoteka datoteke = nova datoteka ("foo / foo-one.txt"); Put niza = file.getPath ();

The staza varijabla bi imala vrijednost:

foo / foo-one.txt // na Unix sustavima foo \ foo-one.txt // na Windows sustavima

Primijetite da se za sustav Windows znak za razdvajanje imena promijenio iz znaka kosa crta (/) koji je proslijeđen konstruktoru u znak kosa kosa crta (\). Ovo je zbog vraćeni Niz uvijek koristi zadani znak za razdvajanje imena platforme.

2.2. getAbsolutePath ()

The getAbsolutePath () metoda se vraća naziv datoteke nakon rješavanja putanje za trenutni direktorij korisnika - ovo se naziva apsolutnim imenom puta. Dakle, za naš prethodni primjer, file.getAbsolutePath () bi se vratio:

/home/username/baeldung/foo/foo-one.txt // na Unix sustavima C: \ Users \ username \ baeldung \ foo \ foo-one.txt // na Windows sustavima

Ova metoda rješava samo trenutni direktorij za relativni put. Stenografski prikazi (poput ".” i "..”) nisu dalje riješeni. Stoga kada izvršimo sljedeći kod iz direktorija {user.home} / baeldung:

Datoteka datoteke = nova datoteka ("bar / baz /../ bar-one.txt"); Put niza = file.getAbsolutePath ();

Vrijednost varijable staza bilo bi:

/home/username/baeldung/bar/baz/../bar-one.txt // na Unix sustavima C: \ Users \ username \ baeldung \ bar \ baz \ .. \ bar-one.txt // na Windows sustavima

2.3. getCanonicalPath ()

The getCanonicalPath () metoda ide korak dalje i rješava apsolutni naziv puta, kao i skraćenice ili suvišna imena poput "."I".. prema strukturi direktorija. Također rješava simboličke poveznice na Unix sustavima i pretvara slovo pogona u standardni slučaj na Windows sustavima.

Dakle, za prethodni primjer, getCanonicalPath () metoda bi vratila:

/home/username/baeldung/bar/bar-one.txt // na Unix sustavima C: \ Users \ username \ baeldung \ bar \ bar-one.txt // na Windows sustavima

Uzmimo još jedan primjer. S obzirom na trenutni direktorij kao $ {user.home} / baeldung i Datoteka objekt stvoren pomoću parametra nova datoteka ("bar / baz /./ baz-one.txt"), izlaz za getCanonicalPath () bilo bi:

/home/username/baeldung/bar/baz/baz-one.txt // na Unix sustavima C: \ Users \ username \ baeldung \ bar \ baz \ baz-one.txt // na Windows sustavima

Vrijedno je spomenuti da jedna datoteka na datotečnom sustavu može imati beskonačan broj apsolutnih putova, jer postoji beskonačan broj načina na koje se mogu koristiti kratke predstave. Međutim, kanonski put uvijek će biti jedinstven budući da su svi takvi prikazi riješeni.

Za razliku od posljednje dvije metode, getCanonicalPath () može baciti IOException jer zahtijeva upite datotečnog sustava.

Na primjer, na Windows sustavima, ako stvorimo Datoteka objekt s jednim od ilegalnih znakova, rješavanje kanonske staze bacit će znak IOException:

nova datoteka ("*"). getCanonicalPath ();

3. Slučaj upotrebe

Recimo da pišemo metodu koja uzima a Datoteka objekt kao parametar i sprema njegovo potpuno kvalificirano ime u bazu podataka. Ne znamo je li put relativan ili sadrži skraćenice. U ovom slučaju, možda ćemo htjeti koristiti getCanonicalPath ().

Međutim, budući da getCanonicalPath () čita datotečni sustav, dolazi uz cijenu izvedbe. Ako smo sigurni da nema suvišnih imena ili simboličkih poveznica, a velika i mala slova pogona su standardizirana (ako se koristi Windows OS), radije bi trebali koristiti getAbsoultePath ().

4. Zaključak

U ovom smo brzom vodiču pokrili razlike između njih tri Datoteka metode za dobivanje putanje datotečnog sustava. Pokazali smo i slučaj upotrebe u kojem jedna metoda može biti preferirana u odnosu na drugu.

A Junit test klasa koja pokazuje primjere ovog članka može se naći na GitHubu.