Şu anda tamamen kafam karıştı - çoğunlukla terminoloji yüzünden sanırım. Birisi lütfen farklılıklar konusunda bana rehberlik edebilir veya Kukla geçirmez materyal için birkaç bağlantı sağlayabilir mi? Özellikle URI'den URL'ye ve Kaynaktan Dosyaya? Bana göre, sırasıyla aynı şey olmaları gerektiği gibi geliyor ...
Terminoloji kafa karıştırıcı ve bazen kafa karıştırıcıdır ve çoğunlukla Java'nın hem API hem de platform olarak zaman içindeki evriminden doğmuştur. Bu terimlerin ne yaptıkları anlamına geldiğini anlamak için Java'nın tasarımını etkileyen iki şeyi tanımak önemlidir:
- Geriye dönük uyumluluk. Eski uygulamalar, ideal olarak değişiklik yapılmadan yeni kurulumlarda çalışmalıdır. Bu, eski bir API'nin (adları ve terminolojisiyle birlikte) tüm yeni sürümlerde korunması gerektiği anlamına gelir.
- Çapraz platform. API, ister işletim sistemi ister tarayıcı olsun, temel platformunun kullanılabilir bir özetini sağlamalıdır.
Kavramları ve nasıl oluştuklarını gözden geçireceğim. Daha sonra diğer özel sorularınızı cevaplayacağım çünkü ilk kısımdaki bir şeye atıfta bulunmam gerekebilir.
"Kaynak" nedir?
Bulunabilen ve okunabilen soyut, genel bir veri parçası. Basitçe söylersek, Java bunu bir dosya olmayabilecek ancak adlandırılmış bir veri parçasını temsil eden bir "dosyaya" başvurmak için kullanır. Java'da doğrudan bir sınıf veya arayüz temsiline sahip değildir , ancak özellikleri nedeniyle (konumlandırılabilir, okunabilir) genellikle bir URL ile temsil edilir.
Java'nın ilk tasarım hedeflerinden biri, bir tarayıcının içinde, çok sınırlı haklara / ayrıcalıklara / güvenlik açıklığına sahip korumalı bir uygulama (apletler!) Olarak çalıştırılmak olduğu için, Java bir dosya (yerel dosya sistemi) ve bir kaynak (okuması gereken bir şey). Uygulamayla ilgili bir şey okumanın (simgeler, sınıf dosyaları vb.), ClassLoader.getResource
File sınıfı aracılığıyla değil de yapılmasının nedeni budur .
Ne yazık ki, "kaynak" aynı zamanda bu yorumun dışında yararlı bir genel terim olduğundan , bu anlamda bir kaynak olmayan çok özel şeyleri (örneğin , ResourceBundle , UIResource , Resource sınıfı) adlandırmak için de kullanılır .
Bir kaynağı (bir yolu) temsil eden ana sınıflar java.nio.file.Path , java.io.File , java.net.URI ve java.net.URL'dir .
Dosya (java.io, 1.0)
Dosya ve dizin yol adlarının soyut bir temsili.
File sınıfı , platformun yerel dosya sistemi aracılığıyla erişilebilen bir kaynağı temsil eder . Yalnızca dosyanın adını içerir, bu nedenle, ana bilgisayar platformunun kendi ayarlarına, kurallarına ve sözdizimine göre yorumladığı bir yoldur (daha sonra bakın).
Dosyanın yerel bir şeye işaret etmesi gerekmediğini unutmayın , sadece ana bilgisayar platformunun dosya erişimi bağlamında anladığı bir şeye, örneğin Windows'ta bir UNC yolu. Bir ZIP dosyasını işletim sisteminize bir dosya sistemi olarak bağlarsanız, Dosya içerdiği girdileri iyi okuyacaktır.
URL (java.net, 1.0)
Sınıf URL'si, World Wide Web üzerindeki bir "kaynağa" işaret eden bir Tekdüzen Kaynak Konum Belirleyiciyi temsil eder. Bir kaynak, bir dosya veya dizin kadar basit bir şey olabilir veya bir veritabanına veya bir arama motoruna yönelik bir sorgu gibi daha karmaşık bir nesneye bir başvuru olabilir.
Bir kaynak kavramıyla birlikte, URL bu kaynağı, File sınıfının ana bilgisayar platformundaki bir dosyayı temsil ettiği şekilde temsil eder: bir kaynağa işaret eden yapılandırılmış bir dize olarak . URL ek olarak kaynağa nasıl ulaşılacağına dair ipucu veren bir şema içerir ("dosya:" "ana bilgisayar platformuna sor" olarak) ve bu nedenle kaynaklara HTTP, FTP, JAR içinde ve başka bir şeyle işaret etmeye izin verir.
Ne yazık ki, URL'ler "dosya" ve "yol" kullanımı dahil olmak üzere kendi sözdizimi ve terminolojisiyle birlikte gelir. URL'nin bir dosya-URL'si olması durumunda, URL.getFile, başvurulan dosyanın yol dizesiyle aynı olan bir dize döndürür.
Class.getResource
bir URL döndürür: Geri dönen Dosyadan daha esnektir ve 1990'ların başında hayal edildiği gibi sistemin ihtiyaçlarına hizmet etmiştir.
URI (java.net, 1.4)
Bir Tekdüzen Kaynak Tanımlayıcısı (URI) başvurusunu temsil eder.
URI, URL üzerinden (hafif) bir soyutlamadır. URI ile URL arasındaki fark kavramsaldır ve çoğunlukla akademiktir, ancak URI biçimsel anlamda daha iyi tanımlanır ve daha geniş bir kullanım alanı yelpazesini kapsar. URL ve URI aynı şey olmadığından / olmadığından, bunları temsil etmek için URI.toURL ve URL.toURI yöntemleriyle biri ve diğeri arasında hareket edecek yeni bir sınıf tanıtıldı.
Java'da, URL ile URI arasındaki temel fark, bir URL'nin çözümlenebilir olma beklentisini taşımasıdır , bu , uygulamanın bir InputStream'den isteyebileceği bir şeydir; Bir URI daha soyut bir thingamajig gibi muamele edilir olabilecek bir şey çözülebilir işaret (ve genellikle yapar), ama ne anlama geldiğini ve nasıl bağlam ve yorumlamaya daha açık ulaşmak için.
Yol (java.nio.file, 1.7)
Bir dosya sistemindeki bir dosyayı bulmak için kullanılabilecek bir nesne. Tipik olarak sisteme bağımlı bir dosya yolunu temsil eder.
Path arayüzünde simge haline getirilen yeni dosya API'si, File sınıfının sunabileceğinden çok daha fazla esneklik sağlar. Path arabirimi, File sınıfının bir soyutlamasıdır ve New IO File API'nin bir parçasıdır . Dosya, ana bilgisayar platformu tarafından anlaşıldığı gibi bir "dosyaya" işaret ettiğinde, Yol daha geneldir: keyfi bir dosya sistemindeki bir dosyayı (kaynağı) temsil eder .
Yol, ana bilgisayar platformunun dosya konseptine olan güvenini ortadan kaldırır. Bir ZIP dosyasındaki bir giriş, FTP veya SSH-FS aracılığıyla erişilebilen bir dosya, uygulama sınıf yolunun çok köklü bir temsili veya FileSystem arayüzü ve sürücüsü FileSystemProvider aracılığıyla anlamlı bir şekilde temsil edilebilecek herhangi bir şey olabilir. Dosya sistemlerini "bağlama" gücünü bir Java uygulamasının içeriğine getirir.
Ana bilgisayar platformu "varsayılan dosya sistemi" ile temsil edilir; aradığınızda File.toPath
, varsayılan dosya sisteminde bir Yol alırsınız.
Şimdi, bir jar dosyasındaki bir sınıfa veya paketi referans alan bir konumlandırıcım varsa, bu ikisi (yani bir dosya dizesinin yolu) farklı olur mu?
Olası olmayan. Kavanoz dosya yerel dosya sistemi üzerinde ise, bir sorgu bileşeni olmamalıdır, bu nedenle URL.getPath
ve URL.getFile
aynı sonucu dönmelidir. Ancak, ihtiyacınız olanı seçin: dosya-URL'leri genellikle sorgu bileşenlerine sahip olmayabilir, ancak yine de bir tane ekleyebilirim.
Son olarak - ve en önemlisi - neden File nesnesine ihtiyacım var; Neden bir Kaynak (URL) yeterli değil?
URL yeterli olmayabilir çünkü Dosya size izinler (okunabilir, yazılabilir, çalıştırılabilir), dosya türü (ben bir dizin miyim?) Ve yerel dosya sistemini arama ve değiştirme yeteneği gibi temel verilere erişim sağlar. Bunlar ihtiyacınız olan özelliklerse, Dosya veya Yol bunları sağlar.
Yol'a erişiminiz varsa Dosyaya ihtiyacınız yoktur. Yine de bazı eski API'ler Dosya gerektirebilir.
(Ve bir Kaynak nesnesi var mı?)
Hayır yok. Onun gibi isimlendirilmiş pek çok şey var ama anlamında bir kaynak değiller ClassLoader.getResource
.
Path