Membandingkan getPath (), getAbsolutePath (), dan getCanonicalPath () di Java

1. Ikhtisar

Kelas java.io.File memiliki tiga metode - getPath () , getAbsolutePath () dan getCanonicalPath () - untuk mendapatkan jalur sistem file.

Pada artikel ini, kita akan melihat sekilas perbedaan di antara keduanya dan membahas kasus penggunaan di mana Anda dapat memilih untuk menggunakan salah satu daripada yang lain.

2. Definisi dan Contoh Metode

Mari kita mulai dengan membahas definisi dari tiga metode, bersama dengan contoh berdasarkan memiliki struktur direktori berikut yang ada di direktori home pengguna:

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

Sederhananya, getPath () mengembalikan representasi String dari nama jalur abstrak file. Ini pada dasarnya adalah nama jalur yang diteruskan ke konstruktor File .

Jadi, jika objek File dibuat menggunakan jalur relatif, nilai yang dikembalikan dari metode getPath () juga akan menjadi jalur relatif.

Jika kita memanggil kode berikut dari direktori {user.home} / baeldung :

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

The path variabel akan memiliki nilai:

foo/foo-one.txt // on Unix systems foo\foo-one.txt // on Windows systems

Perhatikan bahwa untuk sistem Windows, karakter pemisah nama telah berubah dari karakter garis miring (/), yang diteruskan ke konstruktor, menjadi karakter garis miring terbalik (\). Ini karena String yang dikembalikan selalu menggunakan karakter pemisah nama default platform .

2.2. getAbsolutePath ()

Metode getAbsolutePath () mengembalikan nama jalur file setelah menyelesaikan jalur untuk direktori pengguna saat ini - ini disebut nama jalur absolut. Jadi, untuk contoh kita sebelumnya, file.getAbsolutePath () akan mengembalikan:

/home/username/baeldung/foo/foo-one.txt // on Unix systems C:\Users\username\baeldung\foo\foo-one.txt // on Windows systems

Metode ini hanya menyelesaikan direktori saat ini untuk jalur relatif. Representasi singkatan (seperti " ." Dan " .." ) tidak diselesaikan lebih lanjut. Karenanya ketika kita menjalankan kode berikut dari direktori {user.home} / baeldung:

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

Nilai dari jalur variabel adalah:

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

2.3. getCanonicalPath ()

Metode getCanonicalPath () melangkah lebih jauh dan menyelesaikan nama path absolut serta singkatan atau nama yang berlebihan seperti “ . "Dan" .. " sesuai dengan struktur direktori. Ini juga menyelesaikan tautan simbolis pada sistem Unix dan mengubah huruf drive menjadi kasus standar pada sistem Windows.

Jadi untuk contoh sebelumnya, metode getCanonicalPath () akan mengembalikan:

/home/username/baeldung/bar/bar-one.txt // on Unix systems C:\Users\username\baeldung\bar\bar-one.txt // on Windows systems

Mari kita ambil contoh lain. Diberikan direktori saat ini sebagai $ {user.home} / baeldung dan objek File yang dibuat menggunakan parameter new File (“bar / baz /./ baz-one.txt”) , output untuk getCanonicalPath () adalah:

/home/username/baeldung/bar/baz/baz-one.txt // on Unix systems C:\Users\username\baeldung\bar\baz\baz-one.txt // on Windows Systems

Perlu disebutkan bahwa satu file pada sistem file dapat memiliki jumlah jalur absolut yang tak terbatas karena cara representasi steno dapat digunakan dalam jumlah tak terbatas. Namun, jalur kanonis akan selalu unik karena semua representasi tersebut diselesaikan.

Tidak seperti dua metode terakhir, getCanonicalPath () mungkin menampilkan IOException karena memerlukan kueri sistem file.

Misalnya, pada sistem Windows, jika kita membuat objek File dengan salah satu karakter ilegal, menyelesaikan jalur kanonis akan memunculkan IOException :

new File("*").getCanonicalPath();

3. Kasus Penggunaan

Katakanlah kita sedang menulis metode yang menggunakan objek File sebagai parameter dan menyimpan nama yang sepenuhnya memenuhi syarat ke dalam database. Kami tidak tahu apakah jalur itu relatif atau berisi singkatan. Dalam kasus ini, kita mungkin ingin menggunakan getCanonicalPath () .

Namun, karena getCanonicalPath () membaca sistem file, hal itu menimbulkan biaya kinerja. Jika kita yakin bahwa tidak ada nama yang berlebihan atau tautan simbolik dan huruf drive terstandarisasi (jika menggunakan OS Windows), maka kita sebaiknya memilih menggunakan getAbsoultePath () .

4. Kesimpulan

Dalam tutorial singkat ini, kami membahas perbedaan antara tiga metode File untuk mendapatkan jalur sistem file. Kami juga telah menunjukkan kasus penggunaan di mana satu metode mungkin lebih disukai daripada yang lain.

Sebuah Junit kelas uji menunjukkan contoh artikel ini dapat ditemukan di atas pada GitHub.