Pertanyaan Apa perbedaan antara Sumber Daya, URL, URL, Path, dan File di Java?


Saya sedang melihat potongan kode Java sekarang, dan itu mengambil jalur sebagai String dan mendapatkan URL-nya URL resource = ClassLoader.getSystemClassLoader().getResource(pathAsString);, lalu menelepon String path = resource.getPath() dan akhirnya dieksekusi new File(path);.

Oh, dan ada juga panggilan ke URL url = resource.toURI(); dan String file = resource.getFile().

Saya benar-benar bingung sekarang - kebanyakan karena terminologi, saya kira. Dapatkah seseorang tolong memandu saya melalui perbedaan, atau memberikan beberapa tautan ke materi tahan-boneka? Terutama URI ke URL dan Sumber daya untuk File? Bagiku, rasanya seperti mereka seharusnya sama, masing-masing ...

Perbedaan antara getFile() dan getPath() dijelaskan di sini: Apa perbedaan antara url.getFile () dan getpath ()? (Menariknya mereka berdua tampaknya mengembalikan Strings, yang mungkin menambah banyak hal dalam pikiran saya ...)

Sekarang, jika saya memiliki pelacak yang mereferensikan kelas atau paket dalam file jar, apakah kedua (mis. Jalur string file) berbeda?

resource.toString() akan memberi Anda jar:file:/C:/path/to/my.jar!/com/example/, setelah semua (perhatikan tanda seru).

Apakah perbedaan antara URI dan URL  di Jawa bahwa yang pertama tidak menyandikan spasi? Cf. File, URI, dan URL yang bertentangan di Java (Jawaban ini menjelaskan umum, konseptual perbedaan antara dua istilah dengan cukup baik: Identifikasi URI dan lokasi URL;)

Terakhir - dan yang paling penting - mengapa saya perlu File obyek; mengapa bukan Sumber Daya (URL) cukup? (Dan apakah ada objek Resource?)

Maaf jika pertanyaan ini sedikit tidak teratur; itu hanya mencerminkan kebingungan yang saya miliki ... :)


76
2018-01-08 16:43


asal


Jawaban:


PERBARUI 2017-04-12 Memeriksa Jawaban JvR karena mengandung penjelasan yang lebih lengkap dan tepat!


Harap dicatat bahwa saya tidak menganggap diri saya 100% kompeten untuk menjawab, tetapi tetap saja ada beberapa komentar:

  • File mewakili file atau direktori yang dapat diakses melalui sistem file
  • sumber adalah istilah umum untuk objek data yang dapat dimuat oleh aplikasi
    • biasanya sumber daya adalah file yang didistribusikan dengan aplikasi / pustaka dan dimuat melalui mekanisme pemuatan kelas (ketika mereka berada di jalur kelas)
  • URL#getPath adalah rajin di bagian jalur URL (protocol://host/path?query)
  • URL#getFile sesuai kembali JavaDoc path+query

Di Jawa, URI hanyalah struktur data untuk memanipulasi pengenal generik itu sendiri.

URL di sisi lain adalah pencari sumber daya dan menawarkan Anda fitur untuk benar-benar membaca sumber daya melalui terdaftar URLStreamHandlers.

URL dapat mengarah ke sumber daya sistem file dan Anda dapat membangun URL untuk setiap sumber daya sistem file dengan menggunakan file:// protokol (karenanya File <-> URL hubungan).

Juga sadari itu URL#getFile tidak terkait dengan java.io.File.


Mengapa saya membutuhkan objek File; mengapa Sumber Daya (URL) tidak cukup?

Cukup. Hanya jika Anda ingin meneruskan sumber daya ke beberapa komponen yang hanya dapat bekerja dengan file, Anda harus mendapatkannya Filedari situ. Namun tidak semua URL sumber daya dapat dikonversi menjadi Files.

Dan apakah ada objek Sumber Daya?

Dari sudut pandang JRE, itu hanya sebuah istilah. Beberapa kerangka memberi Anda kelas seperti itu (mis. Sumber daya musim semi).


37
2018-01-08 16:58



Saya benar-benar bingung sekarang - kebanyakan karena terminologi, saya kira. Dapatkah seseorang tolong memandu saya melalui perbedaan, atau memberikan beberapa tautan ke materi tahan-boneka? Terutama URI ke URL dan Sumber Daya ke File? Bagiku, rasanya seperti mereka seharusnya sama, masing-masing ...

Terminologi ini membingungkan dan terkadang membingungkan, dan kebanyakan lahir dari evolusi Jawa sebagai API dan sebagai platform dari waktu ke waktu. Untuk memahami bagaimana istilah-istilah ini menjadi berarti apa yang mereka lakukan, penting untuk mengenali dua hal yang memengaruhi desain Java:

  • Kompatibilitas mundur.  Aplikasi lama harus berjalan pada instalasi yang lebih baru, idealnya tanpa modifikasi. Ini berarti bahwa API lama (dengan nama dan terminologinya) perlu dipertahankan melalui semua versi yang lebih baru.
  • Lintas-platform.  API harus menyediakan abstraksi yang dapat digunakan dari platform yang mendasarinya, apakah itu sistem operasi atau browser.

Saya akan berjalan melalui konsep dan bagaimana mereka menjadi. Saya akan menjawab pertanyaan Anda yang lain setelah itu, karena saya mungkin harus merujuk pada sesuatu di bagian pertama.

Apa itu "Sumber"?

Sebuah data abstrak dan umum yang dapat ditemukan dan dibaca.  Loosely said, Java menggunakan ini untuk merujuk ke "file" yang mungkin bukan file tetapi mewakili bagian data yang bernama. Itu tidak memiliki kelas langsung atau representasi antarmuka di Jawa, tetapi karena propertinya (dapat ditemukan, dapat dibaca) sering diwakili oleh sebuah URL.

Karena salah satu tujuan desain awal Java harus dijalankan di dalam browser, sebagai aplikasi sandboxed (applet!) Dengan hak / hak / izin keamanan yang sangat terbatas, Java membuat perbedaan yang jelas (teoritis) antara file (sesuatu pada sistem file lokal) dan sumber daya (sesuatu yang perlu dibaca).  Inilah sebabnya mengapa membaca sesuatu relatif terhadap aplikasi (ikon, file kelas, dan sebagainya) dilakukan melalui ClassLoader.getResource dan tidak melalui kelas File.

Sayangnya, karena "sumber daya" juga merupakan istilah generik yang berguna di luar interpretasi ini, juga digunakan untuk menyebutkan hal-hal yang sangat spesifik (misalnya kelas ResourceBundle, UIResource, Sumber) yang tidak, dalam pengertian ini, sumber daya.

Kelas-kelas utama yang mewakili (jalan menuju) sumber daya java.nio.file.Path, java.io.File, java.net.URI, dan java.net.URL.

Mengajukan (java.io, 1.0)

Representasi abstrak dari nama file dan direktori.

Kelas File mewakili sumber daya yang ada dapat dijangkau melalui sistem file asli platform. Ini hanya berisi nama file, jadi itu benar-benar lebih jalan (lihat nanti) bahwa platform host menafsirkan sesuai dengan pengaturannya sendiri, aturan, dan sintaks.

Perhatikan bahwa File tidak perlu menunjuk ke sesuatu lokal, hanya sesuatu yang dipahami oleh platform host dalam konteks akses file, mis. jalur UNC di Windows. Jika Anda me-mount file ZIP sebagai sistem file di OS Anda, maka File akan membaca entri yang terkandung dengan baik.

URL (java.net, 1.0)

URL Kelas merepresentasikan Uniform Resource Locator, sebuah penunjuk ke "sumber daya" di World Wide Web. Sumber daya dapat berupa sesuatu yang sederhana seperti file atau direktori, atau dapat menjadi referensi ke objek yang lebih rumit, seperti kueri ke database atau ke mesin pencari.

Bersamaan dengan konsep sumber daya, URL mewakili sumber daya itu dengan cara yang sama kelas File mewakili file dalam platform host: sebagai string terstruktur yang mengarah ke sumber daya.  URL juga mengandung skema yang mengisyaratkan bagaimana cara mencapai sumber daya (dengan "file:" menjadi "tanyakan platform host"), dan dengan demikian memungkinkan menunjuk sumber daya melalui HTTP, FTP, di dalam JAR, dan yang lainnya.

Sayangnya, URL datang dengan sintaks dan terminologi mereka sendiri, termasuk penggunaan "file" dan "path". Jika URL adalah file-URL, URL.getFile akan mengembalikan string yang identik dengan string path dari file yang direferensikan.

Class.getResource mengembalikan URL: lebih fleksibel daripada mengembalikan File, dan telah memenuhi kebutuhan sistem seperti yang dibayangkan pada awal 1990-an.

URI (java.net, 1.4)

Mewakili referensi Uniform Resource Identifier (URI).

URI adalah abstraksi (kecil) di atas URL.  Perbedaan antara URI dan URL adalah konseptual dan kebanyakan akademik, tetapi URI didefinisikan lebih baik dalam arti formal, dan mencakup berbagai kasus penggunaan yang lebih luas. Karena URL dan URI adalah / tidak sama, kelas baru diperkenalkan untuk mewakili mereka, dengan metode URI.toURL dan URL.toURI untuk berpindah antara satu dan yang lain.

Di Java, perbedaan utama antara URL dan URI adalah itu URL membawa harapan untuk dapat dipecahkan, sesuatu aplikasi mungkin ingin InputStream dari; URI diperlakukan lebih seperti sebuah thingamajig abstrak itu mungkin arahkan ke sesuatu yang dapat dipecahkan (dan biasanya memang demikian), tetapi apa artinya dan bagaimana mencapainya lebih terbuka terhadap konteks dan interpretasi.

Path (java.nio.file, 1.7)

Objek yang dapat digunakan untuk mencari file dalam sistem file. Ini biasanya akan mewakili jalur file yang bergantung pada sistem.

API file baru, yang di-iconified dalam antarmuka Path, memungkinkan fleksibilitas yang jauh lebih besar daripada yang bisa ditawarkan kelas File. Antarmuka Path adalah sebuah abstraksi kelas File, dan merupakan bagian dari API Berkas IO Baru. Di mana File selalu menunjuk ke "file" sebagaimana dipahami oleh platform host, Path lebih generik: itu merupakan file (sumber daya) dalam suatu sewenang-wenang berkas sistem.

Path menghilangkan ketergantungan pada konsep platform host file. Ini bisa berupa entri dalam file ZIP, file yang dapat dijangkau melalui FTP atau SSH-FS, representasi multi-root dari classpath aplikasi, atau benar-benar apa pun yang dapat diwakili secara berarti melalui antarmuka FileSystem dan driver-nya, FileSystemProvider. Ini membawa kekuatan sistem file "pemasangan" ke dalam konteks aplikasi Java.

Platform host diwakili melalui "sistem file default"; ketika kamu menelepon File.toPath, Anda mendapatkan Path pada sistem file default.


Sekarang, jika saya memiliki pelacak yang mereferensikan kelas atau paket dalam file jar, apakah kedua (mis. Jalur string file) berbeda?

Tidak sepertinya. Jika file jar ada di sistem file lokal, Anda seharusnya tidak memiliki komponen permintaan, jadi URL.getPath dan URL.getFile harus mengembalikan hasil yang sama. Namun, pilih yang Anda butuhkan: file-URL biasanya tidak memiliki komponen permintaan, tapi saya yakin bisa menambahkannya.

Terakhir - dan yang paling penting - mengapa saya membutuhkan objek File; mengapa Sumber Daya (URL) tidak cukup?

URL mungkin tidak cukup karena File memberi Anda akses ke data housekeeping seperti izin (dapat dibaca, dapat ditulis, dapat dieksekusi), jenis file (apakah saya direktori?), Dan kemampuan untuk mencari dan memanipulasi sistem file lokal. Jika ini adalah fitur yang Anda butuhkan, maka File atau Jalur menyediakannya.

Anda tidak perlu File jika Anda memiliki akses ke Path. Namun, beberapa API yang lebih lama mungkin memerlukan File.

(Dan apakah ada objek Resource?)

Tidak, tidak ada. Ada banyak hal yang dinamai seperti itu, tetapi mereka bukan sumber daya dalam arti ClassLoader.getResource.


26
2017-11-21 16:56



Jawaban Pavel Horal itu bagus.

Seperti yang dia katakan, kata "file" memiliki arti yang sama sekali berbeda (praktis tidak berhubungan) dalam URL#getFile vs java.io.File - Mungkin itu bagian dari kebingungan.

Hanya untuk menambahkan:

  • SEBUAH sumber di Jawa adalah konsep abstrak, sumber data yang bisa dibaca. Lokasi (atau alamat) dari sumber daya diwakili di Jawa oleh a URL obyek.

  • SEBUAH sumber dapat sesuai dengan file biasa di sistem file lokal (khususnya, saat itu URL dimulai dengan file://). Tetapi sumber daya lebih umum (bisa juga beberapa file disimpan dalam toples, atau beberapa data untuk dibaca dari jaringan, atau dari memori, atau ...). Dan itu juga lebih terbatas, karena a File (selain menjadi hal lain selain file biasa: direktori, tautan) juga dapat dibuat dan ditulis.

  • Ingat di Java a File objek tidak benar-benar mewakili "file" tetapi lokasi (nama lengkap, dengan path) dari file. Jadi, a File objek memungkinkan Anda untuk mencari (dan membuka) file, sebagai a URLmemungkinkan Anda mengakses (dan membuka) sumber daya. (Tidak ada Resource kelas di Jawa untuk mewakili sumber daya, tetapi tidak ada yang mewakili file! sekali lagi : File bukan file, itu jalan file).


11
2018-01-08 17:49



Seperti yang saya pahami, Anda dapat mengkategorikannya sebagai berikut:

Berbasis Web: URI dan URL.

  • URL: URL adalah lokasi yang pasti di internt (hanya webaddress biasa seperti - stackoverflow.com)
  • URI: Pernah URL adalah URI. Tetapi URI juga dapat berisi hal-hal seperti "mailto:", jadi mereka juga, yah beberapa dari "naskah" yang akan saya katakan.

Dan lokal: Sumber Daya, Jalur, dan File

  • Sumber daya: Sumber daya adalah file di dalam toples Anda. Mereka digunakan untuk memuat file dari guci / kontainer.
  • Path: Path pada dasarnya adalah sebuah string. Tapi itu datang dengan beberapa fungsi berguna untuk menggabungkan beberapa string, atau menambahkan file ke string. Ini memastikan jalur yang Anda bangun valid.
  • File: Ini adalah referensi ke direktori atau file. Ini digunakan untuk mengubah file, membukanya dll.

Akan lebih mudah jika mereka digabungkan ke dalam satu kelas - mereka benar-benar membingungkan: D

Saya harap ini membantu Anda :)

(Saya baru saja melihat dokumentasi - lihat docs.oracle.com)


3
2018-01-08 17:02



File adalah representasi abstrak dari suatu entitas dalam sistem file lokal.

Jalur umumnya merupakan string yang menunjukkan lokasi file dalam sistem file. Biasanya tidak termasuk nama file. Jadi c: \ documents \ mystuff \ stuff.txt akan memiliki jalur dengan nilai "C: \ documents \ mystuff" Jelas format nama file dan path absolut akan sangat bervariasi dari filesystem ke filesystem.

URL adalah susbset URI dengan URL yang biasanya mewakili sumber yang dapat diakses melalui http. Saya tidak berpikir ada aturan ketat tentang kapan sesuatu harus menjadi URI vs URL. URI adalah string dalam bentuk "protocol: // resource-identifier" seperti bitcoin: // params, http://something.com?param=value. Kelas seperti URL umumnya membungkus string dan menyediakan metode utilitas yang String tidak memiliki alasan untuk memasok.

Tidak ada yang namanya Sumber Daya, setidaknya tidak dalam arti yang Anda bicarakan. Hanya karena metode bernama getResource tidak berarti mengembalikan objek bertipe Resource.

Akhirnya, cara terbaik untuk mengetahui apa yang dilakukan oleh metode Kelas adalah membuat instance di kode Anda, memanggil metode dan kemudian melangkah dalam mode debug atau mengirim hasilnya ke System.out.


0
2018-01-08 17:08