Java: Path vs File

200

Untuk aplikasi baru yang ditulis dalam Java 7, apakah ada alasan untuk menggunakan java.io.Fileobjek lagi atau dapatkah kita menganggapnya usang?

Saya percaya java.nio.file.Pathdapat melakukan segala yang java.io.Filebisa dilakukan dan banyak lagi.

dogbane
sumber

Jawaban:

153

Singkat cerita:

java.io.Filekemungkinan besar tidak akan pernah ditinggalkan / tidak didukung. Yang mengatakan, java.nio.file.Pathadalah bagian dari java.nio.filelib yang lebih modern , dan melakukan segalanya java.io.Filebisa, tetapi umumnya dengan cara yang lebih baik, dan lebih banyak lagi.

Untuk proyek baru, gunakan Path.

Dan jika Anda memerlukan Fileobjek untuk warisan, cukup hubungi Path # toFile ()

Bermigrasi dari File ke Path

Halaman Oracle ini menyoroti perbedaan, dan peta java.io.File functionalityuntukjava.nio.file lib (including Path) functionality

Artikel oleh Janice J. Heiss dan Sharon Zakhour, Mei 2009, membahas Sistem File NIO.2 di JDK 7

Don Cheadle
sumber
12
Anda dapat membaca komentar Oracle tentang perbedaan-perbedaan di sini: docs.oracle.com/javase/tutorial/essential/io/legacy.html
Josiah Yoder
4
Perhatikan juga bahwa "File" (dalam bentuk jamak) tidak ditinggalkan. Ini pada dasarnya adalah kelas abstrak yang beroperasi pada objek Path dan melakukan banyak fitur dari kelas File lama, seperti isDirectory () atau exist ()
Josiah Yoder
2
Sekarang aku bertanya-tanya: mengapa dialog File / FolderChooser baru dalam JavaFX 8 itu masih menggunakan Filebukan Path?
piegames
2
Path adalah antarmuka. Untuk membuat contoh, gunakan Paths.get (nama file). Bisa jadi karena kebingungan harus menulis Files.exists (Paths.get (nama file)) bukan File baru (nama file) .exists () bahwa API yang lebih lama masih digunakan.
Josiah Yoder
Pathdapat lebih mudah dimodifikasi untuk "menambah anak" dengan resolve(...)atau "naik satu tingkat" dengan getParent(), dll. sedangkan Filetidak bisa. Intinya begitu Anda selesai memodifikasi Path, Anda akan sering mengonversinya toFile()sehingga dapat dikirim ke metode lama seperti FileInputStreamkonstruktor.
MasterHD
18

dapatkah kita menganggapnya sudah usang?

Tidak, Anda tidak dapat menganggapnya usang kecuali dan sampai ditandai di FileJavadoc.

Marquis dari Lorne
sumber
14
Bahkan jika ini adalah salah satu dari ini "Karena RFC mengatakan demikian" -Jawaban, saya tidak akan menganggapnya sebagai jawaban yang baik. Cukup jelas bahwa File akan diganti oleh Path. Jika Anda ingin menjadi yang terdepan, Anda dapat mulai menggunakan Path dengan segera dan gunakan toFile () di mana diperlukan.
Chris
15
@ Chris Tidak ada yang pernah dihapus dari JDK sejak mereka mengubah model acara AWT di 1.02. Sama sekali tidak 'jelas'. Itu salah.
Marquis of Lorne
5
@ downvoters Jawaban ini pada dasarnya adalah sebuah tautologi. Itu tidak mungkin salah. NB Dalam lima tahun sejak saya menulis jawaban ini, Java 8 kemudian muncul, dan java.io.Filemasih belum dihapus atau bahkan sudah usang, dan masih ada apa pun di Javadoc yang menyarankan bahwa salah satu dari hal-hal ini akan pernah terjadi.
Marquis of Lorne
2
@ EJP Saya baru saja memperbarui komentar Anda. Namun, saya tidak sepenuhnya yakin bahwa Anda benar ketika Anda mengatakan jawabannya adalah tautologi. Pertanyaannya, yang mungkin seharusnya terjepit karena "berdasarkan pendapat", adalah "dapatkah kita menganggapnya sudah usang". Ya, OP dan yang lainnya bisa , tetapi tidak.
mike rodent
@mikerodent Saya sarankan itu hanya kesalahpahaman disengaja tentang apa sebenarnya pertanyaan itu. Juga kutipan parsial.
Marquis of Lorne
8

Lihat artikel ini tentang info lebih lanjut - http://www.oracle.com/technetwork/articles/javase/nio-139333.html

Pada dasarnya file.Path akan menjadi cara untuk pergi dari sekarang, tetapi seperti yang diketahui orang Jawa cenderung untuk tetap kembali kompatibilitas jadi saya kira itu sebabnya mereka meninggalkannya.

LordDoskias
sumber
Bisakah Anda memperbarui tautannya? Saya ingin membaca artikel ini.
John B
Sayangnya saya tidak dapat menemukan artikel asli di halaman web oracle. Berikut adalah versi dari mesin wayback
LordDoskias
1
Saya menemukan artikel itu lagi di sisi normal Oracle - menambahkan tautan untuk menjawab.
Duncan Jones
5

Saya akan menyelesaikan jawaban yang sangat bagus @mmcrae.

apakah ada alasan untuk menggunakan objek java.io.File lagi atau dapatkah kita menganggapnya usang?

Kelas JDK sangat jarang ditinggalkan.
Anda dapat melihat pada API JDK 8 yang sudah usang daftar semua kelas yang sudah tidak digunakan sejak JDK pertama.
Ini hanya berisi sedikit bagian dari kelas yang tidak dapat digunakan oleh dokumentasi Oracle dan komunitas Java.
java.util.Date, java.util.Vector, java.util.Hashtable... yang kelas dengan begitu banyak cacat tidak usang.
Tapi kenapa ?
Karena secara konseptual sesuatu yang deprecatedberarti masih ada tetapi mencegah untuk digunakan karena hal itu pasti akan dihapus.
Ribuan program bergantung pada kelas yang dirancang buruk ini.
Untuk kelas seperti itu, pengembang Java API tidak akan memberikan sinyal seperti itu.

Jawabannya @EJPsangat benar:

Tidak kecuali dan sampai ditandai di Javadoc.

Jadi, saya pikir pertanyaan Anda akan lebih masuk akal dalam istilah-istilahnya:
"Karena kita punya pilihan, haruskah kita menggunakan java.io.Fileatau java.nio.file.Pathuntuk perkembangan baru dan jika jawabannya adalah java.nio.file.Path, bisakah Anda dengan mudah mengambil keuntungan dari java.io.Fileproyek legacy yang digunakan java.io.File?"

Saya percaya java.nio.file.Path dapat melakukan segalanya java.io.File dapat melakukan dan banyak lagi.

Anda punya jawabannya.

Tutorial oracle ini tentang warisan IO menegaskan pemikiran Anda.

Sebelum rilis Java SE 7, java.io.Filekelas adalah mekanisme yang digunakan untuk file I / O, tetapi memiliki beberapa kelemahan.

Banyak metode yang tidak melempar pengecualian ketika gagal, jadi tidak mungkin mendapatkan pesan kesalahan yang berguna. Misalnya, jika penghapusan file gagal, program akan menerima "hapus gagal" tetapi tidak akan tahu apakah itu karena file tidak ada, pengguna tidak memiliki izin, atau ada masalah lain.

Metode ganti nama tidak bekerja secara konsisten di seluruh platform. Tidak ada dukungan nyata untuk tautan simbolik.

Dibutuhkan lebih banyak dukungan untuk metadata, seperti izin file, pemilik file, dan atribut keamanan lainnya.

Mengakses file metadata tidak efisien.

Banyak metode File tidak skala. Meminta daftar direktori besar melalui server dapat mengakibatkan hang. Direktori besar juga dapat menyebabkan masalah sumber daya memori, yang mengakibatkan penolakan layanan.

Itu tidak mungkin untuk menulis kode yang dapat diandalkan yang secara rekursif bisa berjalan pohon file dan merespons dengan tepat jika ada tautan simbolik melingkar.

Dengan begitu banyak kekurangannya java.io.File, kita benar-benar tidak perlu menggunakan kelas ini untuk perkembangan baru.
Dan bahkan untuk menggunakan kode lama java.io.File, Oracle memberikan petunjuk untuk digunakan Path.

Mungkin Anda memiliki kode lawas yang menggunakan java.io.File dan ingin memanfaatkan fungsi java.nio.file.Path dengan dampak minimal pada kode Anda.

Kelas java.io.File menyediakan metode toPath, yang mengubah contoh File gaya lama ke contoh java.nio.file.Path, sebagai berikut:

Path input = file.toPath();

Anda kemudian dapat mengambil keuntungan dari set fitur kaya yang tersedia untuk kelas Path.

Misalnya, anggap Anda memiliki beberapa kode yang menghapus file:

file.delete();

Anda bisa memodifikasi kode ini untuk menggunakan metode Files.delete, sebagai berikut:

Path fp = file.toPath();
Files.delete(fp);
davidxxx
sumber
Singkatnya, dia memang bisa menganggapnya sudah usang jika dia mau.
mike rodent
@ Mike tikus. Persis. Secara konseptual ia / dia harus sementara itu tidak terjadi dalam hal Javadoc untuk alasan yang dijelaskan.
davidxxx
4

Ya, tetapi banyak API yang ada, termasuk API standar Java7 sendiri, masih berfungsi hanya dengan Filetipe.

tak dapat disangkal
sumber
8
Objek Path dapat dikonversi ke objek File menggunakan Path.toFile () , kemudian gunakan API standar.
jacktrades
2
Jadi jawaban Anda adalah 'ya tapi tidak'?
Marquis of Lorne
1

Java.io.File tidak ditinggalkan. Ya java.nio.file.Path lebih baik, tetapi selama masih ada banyak program dan buku teks menggunakan Java.io.File, jika hanya untuk alasan warisan, itu tidak boleh dianggap usang, itu terlalu penting. Melakukan hal itu hanya akan melemparkan kunci pas dalam karya tanpa untung semua. Misalnya kerangka kerja Android menggunakan File untuk beberapa fitur penanganan file dasarnya, banyak hal lain yang perlu dilakukan.

Andrew S
sumber
Dia tidak bertanya apakah Pathlebih baik. Dia bertanya apakah Filesudah usang.
Marquis of Lorne
1
@ EJP Saya pikir Anda sedikit terlalu berlebihan. OP memang bertanya apakah java.io.File sudah usang dan saya menjawab itu .. Dia juga menyatakan "Saya percaya java.nio.file.Path dapat melakukan segalanya yang java.io.File dapat lakukan dan banyak lagi." Saya hanya mengkonfirmasikan komentarnya, itu hampir tidak layak dinilai.
Andrew S
-9

Untuk aplikasi baru yang ditulis dalam Java 7, apakah ada alasan untuk menggunakan objek java.io.File lagi atau dapatkah kita menganggapnya usang?

Ini agak seperti mengatakan: "haruskah Napoleon menyerbu Rusia, atau apakah kubis Brussel ini benar-benar enak?"

Adapun bagian kedua dari pertanyaan, Anda memang bisa menganggapnya sudah usang. Pada Januari 2018, itu tidak ditinggalkan. Tapi tidak ada yang menghentikan Anda mempertimbangkannya begitu. Apakah itu akan memberi Anda keuntungan apa pun dalam kehidupan ini atau yang berikutnya tidak mungkin untuk dikatakan.

mike rodent
sumber
5
Saya tidak mengerti analogi Anda.
Tunaki
Setiap pertanyaan "atau" harus menyajikan dua alternatif logis, yang keduanya pada dasarnya menjawab pertanyaan yang sama.
mike rodent
Maaf, ini terdengar sangat bagus dalam konteks ini. Idenya adalah "Saya ingin menggunakan File. Haruskah saya, ya atau tidak?"
Tunaki
1
Ya saya setuju itu pertanyaan yang dimuat ... terutama karena masih banyak API pihak ke-3 yang ada File. Itu tidak akan mati dalam waktu dekat.
Tunaki
3
it isn't deprecated. But there's nothing to stop you *considering* it soLOL.
Don Cheadle