GetPath (), getAbsolutePath () en getCanonicalPath () in Java vergelijken

1. Overzicht

De java.io.File klasse heeft drie methoden - getPath (), getAbsolutePath () en getCanonicalPath () - om het bestandssysteempad te verkrijgen.

In dit artikel zullen we de verschillen tussen beide snel bekijken en een use-case bespreken waarin u ervoor kunt kiezen om er een boven de andere te gebruiken.

2. Methodedefinities en voorbeelden

Laten we beginnen met het doornemen van de definities van de drie methoden, samen met voorbeelden gebaseerd op het feit dat de volgende directorystructuur aanwezig is in de homedirectory van de gebruiker:

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

Simpel gezegd, getPath () geeft de Draad weergave van de abstracte padnaam van het bestand. Dit is in wezen de padnaam die is doorgegeven aan de het dossier constructeur.

Dus als het het dossier object is gemaakt met behulp van een relatief pad, de geretourneerde waarde van getPath () methode zou ook een relatief pad zijn.

Als we de volgende code aanroepen vanuit de {user.home} / baeldung directory:

Bestandsbestand = nieuw bestand ("foo / foo-one.txt"); String path = file.getPath ();

De pad variabele zou de waarde hebben:

foo / foo-one.txt // op Unix-systemen foo \ foo-one.txt // op Windows-systemen

Merk op dat voor het Windows-systeem het naamscheidingsteken is gewijzigd van de schuine streep naar voren (/), die aan de constructor is doorgegeven, naar de schuine streep (\). Dit is zo omdat de teruggekeerden Draad gebruikt altijd het standaard naamscheidingsteken van het platform.

2.2. getAbsolutePath ()

De getAbsolutePath () methode retourneert de padnaam van het bestand nadat het pad voor de huidige gebruikersdirectory is opgelost - dit wordt een absolute padnaam genoemd. Dus, voor ons vorige voorbeeld, bestand.getAbsolutePath () zou terugbrengen:

/home/username/baeldung/foo/foo-one.txt // op Unix-systemen C: \ Users \ gebruikersnaam \ baeldung \ foo \ foo-one.txt // op Windows-systemen

Deze methode lost alleen de huidige directory op voor een relatief pad. Verkorte weergaven (zoals '.” en "..”) worden niet verder opgelost. Vandaar dat wanneer we de volgende code vanuit de directory uitvoeren {user.home} / baeldung:

Bestandsbestand = nieuw bestand ("bar / baz /../ bar-one.txt"); String path = file.getAbsolutePath ();

De waarde van de variabele pad zou zijn:

/home/username/baeldung/bar/baz/../bar-one.txt // op Unix-systemen C: \ Users \ gebruikersnaam \ baeldung \ bar \ baz \ .. \ bar-one.txt // op Windows-systemen

2.3. getCanonicalPath ()

De getCanonicalPath () methode gaat een stap verder en lost de absolute padnaam op, evenals de afkortingen of overtollige namen zoals '."En".. volgens de directorystructuur. Het ook lost symbolische koppelingen op op Unix-systemen en converteert de stationsletter naar een standaard hoofdlettergebruik op Windows-systemen.

Dus voor het vorige voorbeeld, getCanonicalPath () methode zou terugkeren:

/home/username/baeldung/bar/bar-one.txt // op Unix-systemen C: \ Users \ gebruikersnaam \ baeldung \ bar \ bar-one.txt // op Windows-systemen

Laten we een ander voorbeeld nemen. Gegeven huidige directory als $ {user.home} / baeldung en het dossier object gemaakt met de parameter nieuw bestand ("bar / baz /./ baz-one.txt"), de output voor getCanonicalPath () zou zijn:

/home/username/baeldung/bar/baz/baz-one.txt // op Unix-systemen C: \ Users \ gebruikersnaam \ baeldung \ bar \ baz \ baz-one.txt // op Windows-systemen

Het is de moeite waard te vermelden dat een enkel bestand op het bestandssysteem een ​​oneindig aantal absolute paden kan hebben, aangezien er een oneindig aantal manieren is waarop steno-representaties kunnen worden gebruikt. Echter, het canonieke pad zal altijd uniek zijn aangezien al dergelijke verklaringen zijn opgelost.

In tegenstelling tot de laatste twee methoden, getCanonicalPath () kan gooien IOException omdat het bestandssysteemquery's vereist.

Als we bijvoorbeeld op Windows-systemen een het dossier object met een van de illegale karakters, zal het oplossen van het canonieke pad een IOException:

nieuw bestand ("*"). getCanonicalPath ();

3. Gebruiksvoorbeeld

Laten we zeggen dat we een methode schrijven die een het dossier object als parameter en slaat de volledig gekwalificeerde naam op in een database. We weten niet of het pad relatief is of steno bevat. In dit geval willen we misschien gebruiken getCanonicalPath ().

Echter, sinds getCanonicalPath () leest het bestandssysteem, brengt dit prestatiekosten met zich mee. Als we zeker weten dat er geen overtollige namen of symbolische koppelingen zijn en het hoofdlettergebruik van stations is gestandaardiseerd (als we een Windows-besturingssysteem gebruiken), dan zouden we de voorkeur moeten geven aan het gebruik van getAbsoultePath ().

4. Conclusie

In deze korte tutorial hebben we de verschillen tussen de drie besproken het dossier methoden om het bestandssysteempad op te halen. We hebben ook een use-case laten zien waarbij de ene methode de voorkeur kan hebben boven de andere.

EEN Junit testklasse die de voorbeelden van dit artikel demonstreert, is te vinden op GitHub.