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

1. Gambaran keseluruhan

The java.io.File kelas mempunyai tiga kaedah - getPath () , getAbsolutePath () dan getCanonicalPath () - untuk mendapatkan jalan sistem fail.

Dalam artikel ini, kita akan melihat dengan cepat perbezaan di antara mereka dan membincangkan kes penggunaan di mana anda boleh memilih untuk menggunakannya berbanding yang lain.

2. Definisi Kaedah dan Contohnya

Mari kita mulakan dengan membahas definisi tiga kaedah, bersama dengan contoh berdasarkan struktur direktori berikut yang ada di direktori utama 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 ()

Ringkasnya, getPath () mengembalikan perwakilan String dari nama jalan abstrak fail. Ini pada asasnya nama laluan yang diluluskan kepada fail pembina .

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

Sekiranya kita menggunakan kod berikut dari direktori {user.home} / baeldung :

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

Yang jalan berubah-ubah akan mempunyai nilai:

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

Perhatikan bahawa untuk sistem Windows, watak pemisah nama telah berubah dari watak slash ke depan (/), yang diteruskan ke konstruktor, ke watak garis miring terbalik (\). Ini kerana String yang dikembalikan selalu menggunakan watak pemisah nama lalai platform .

2.2. dapatkanAbsolutePath ()

Kaedah getAbsolutePath () mengembalikan nama laluan fail setelah menyelesaikan jalan untuk direktori pengguna semasa - ini dipanggil nama jalan mutlak. Oleh itu, untuk contoh 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

Kaedah ini hanya menyelesaikan direktori semasa untuk jalan relatif. Perwakilan pendek (seperti " ." Dan " .." ) tidak diselesaikan lebih jauh. Oleh itu, apabila kita melaksanakan kod berikut dari direktori {user.home} / baeldung:

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

Nilai jalan berubah 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 ()

Kaedah getCanonicalPath () melangkah lebih jauh dan menyelesaikan nama jalan mutlak serta nama pendek atau nama berlebihan seperti “ . "Dan" .. " sesuai dengan struktur direktori. Ia juga menyelesaikan pautan simbolik pada sistem Unix dan menukar huruf pemacu ke huruf standard pada sistem Windows.

Jadi untuk contoh sebelumnya, kaedah 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. Memandangkan direktori semasa sebagai $ {user.home} / baeldung dan objek File dibuat menggunakan parameter File baru ("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 bahawa satu fail pada sistem fail boleh mempunyai bilangan jalur mutlak yang tidak terbatas kerana terdapat sebilangan cara yang tidak dapat digunakan perwakilan pendek. Walau bagaimanapun, jalan kanonik akan selalu unik kerana semua perwakilan tersebut diselesaikan.

Tidak seperti dua kaedah terakhir, getCanonicalPath () mungkin membuang IOException kerana memerlukan pertanyaan sistem fail.

Sebagai contoh, pada sistem Windows, jika kita membuat objek File dengan salah satu watak yang tidak sah, menyelesaikan jalan kanonik akan membuang IOException :

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

3. Gunakan Kes

Katakan kita menulis kaedah yang mengambil objek File sebagai parameter dan menyimpan namanya yang memenuhi syarat ke dalam pangkalan data. Kami tidak tahu sama ada jalan itu relatif atau mengandungi singkatan. Dalam kes ini, kita mungkin mahu menggunakan getCanonicalPath () .

Namun, kerana getCanonicalPath () membaca sistem fail, ia memerlukan kos prestasi. Sekiranya kita yakin bahawa tidak ada nama yang berlebihan atau pautan simbolik dan huruf huruf kes diseragamkan (jika menggunakan OS Windows), maka kita lebih suka menggunakan getAbsoultePath () .

4. Kesimpulan

Dalam tutorial ringkas ini, kami membahas perbezaan antara tiga kaedah Fail untuk mendapatkan jalan sistem fail. Kami juga telah menunjukkan kes penggunaan di mana satu kaedah mungkin lebih disukai daripada yang lain.

A Junit kelas ujian yang menunjukkan contoh artikel ini boleh didapati lebih pada GitHub.