Java: Yol ve Dosya


Yanıtlar:


154

Uzun lafın kısası:

java.io.Filebüyük olasılıkla hiçbir zaman kullanımdan kaldırılmayacak / desteklenmeyecektir. Bununla java.nio.file.Pathbirlikte, daha modern java.nio.filelib'in bir parçasıdır ve her şeyi java.io.Fileyapabilir, ancak genellikle daha iyi bir şekilde ve daha fazlasını yapar.

Yeni projeler için kullanın Path.

Ve Fileeski bir nesneye ihtiyacınız varsa , Path # toFile () yöntemini çağırmanız yeterlidir.

Dosyadan Yola Taşıma

Bu Oracle sayfa vurgular farklılıklar ve haritalar java.io.File functionalityiçinjava.nio.file lib (including Path) functionality

Janice J. Heiss ve Sharon Zakhour'un makalesi, Mayıs 2009, JDK 7'deki NIO.2 Dosya Sistemini tartışıyor


12
Oracle'ın farklılıklar hakkındaki yorumlarını buradan okuyabilirsiniz: docs.oracle.com/javase/tutorial/essential/io/legacy.html
Josiah Yoder

4
Ayrıca (çoğul) "Dosyalar" dikkat değil kaldırılan. Aslında Path nesneleri üzerinde çalışan ve eski File sınıfının isDirectory () veya exist () gibi birçok özelliğini gerçekleştiren soyut bir sınıftır
Josiah Yoder

2
Şimdi merak ediyorum: o JavaFX 8'de yeni Dosya / FolderChooser diyaloglar yapmak hala kullanmak niçin Fileyerine Path?
piegames

2
Yol bir arabirimdir. Bir örnek oluşturmak için Paths.get (dosya adı) kullanın. Eski API'nin hala kullanılmakta olduğu yeni File (dosyaadı) .exists () yerine Files.exists (Paths.get (dosyaadı)) yazmak zorunda kalmanın karışıklığı olabilir.
Josiah Yoder

Path, vb. resolve(...)ile " çocuk ekleme" veya "bir seviye yukarı gitme" getParent()vb. ile daha kolay değiştirilebilir File. Esas olarak, Yolu değiştirmeyi bitirdiğinizde, genellikle toFile()bir FileInputStreamkurucu gibi eski yöntemlere gönderilebilecek şekilde dönüştürürsünüz .
MasterHD

18

onaylanmadığını düşünebilir miyiz?

Hayır, olamaz o sürece ve o kadar işaretli kadar kullanımdan kaldırılmış düşünün FileJavadoc.


14
Bu "RFC öyle söylüyor çünkü" biri olsa bile -Yanıtlar, ben iyi bir cevap olarak kabul etmem. Dosyanın Path ile değiştirileceği oldukça açıktır. Eğer vaktinden önce olmak istiyorsanız hemen Path kullanmaya başlayabilir ve gerektiğinde toFile () kullanabilirsiniz.
Chris

15
@Chris 1.02'de AWT olay modelini değiştirdikleri için JDK'dan hiçbir şey kaldırılmadı. Hiç de açık değil. Yanlış.
Lorne Marquis

5
@downvoters Bu cevap aslında bir totolojidir. Yanlış olamaz. Not: Bu yanıtı yazdığım beş yıl içinde, Java 8 daha sonra ortaya çıktı ve java.io.Filehala ne kaldırıldı ne de kullanımdan kaldırıldı ve Javadoc'ta bunlardan herhangi birinin gerçekleşeceğini gösteren hiçbir şey yok.
Lorne Marquis

2
@EJP Bu yorumunu henüz onaylamadım. Ancak cevabın bir totoloji olduğunu söylediğinizde haklı olduğunuzdan emin değilim. Muhtemelen "kanaat temelli" olduğu için ezilmesi gereken soru, "itiraz edildiğini düşünebilir miyiz " dir. Evet, OP ve herkes yapabilir , ama değil.
mike kemirgen

@mikerodent Bu sorunun gerçekte ne hakkında olduğunu sadece yanlış bir şekilde yanlış okumanızı öneriyorum. Ayrıca kısmi bir teklif.
Lorne Marquis

8

Daha fazla bilgi için bu makaleye göz atın - http://www.oracle.com/technetwork/articles/javase/nio-139333.html

Temelde file.Path bundan sonra gitmek için bir yol olacak ama yaygın olarak bilinen Java insanlar geri uyumluluk eğilimi bu yüzden sanırım bu yüzden bıraktılar.


Lütfen bağlantıyı günceller misiniz? Bu makaleyi okumak istiyorum.
John B

Ne yazık ki orijinal makaleyi oracle web sayfasında bulamadım. İşte geri dönüş
LordDoskias

1
Makaleyi yine normal bir Oracle tarafında yanıtlamak için eklenen bağlantıda buldum.
Duncan Jones

5

Çok iyi bir cevap vereceğim @mmcrae.

java.io.File nesnesini kullanmak için herhangi bir neden var mı yoksa kullanılmadığını düşünebilir miyiz?

JDK sınıfları nadiren kullanımdan kaldırılıyor.
Sen görebilirsiniz JDK 8 API artık kullanılmayacağı listelemek ilk JDK beri kaldırılmış tüm sınıfları.
Oracle belgelerinin ve Java topluluğunun kullanmaktan vazgeçtiği sınıfların sadece küçük bir bölümünü içerir.
java.util.Date, java.util.Vector, java.util.Hashtable... Birçok kusurları kaldırılmış değildir bu yüzden birlikte sınıfları olduğunu.
Ama neden ?
Çünkü kavramsal olarak deprecatedhala orada bir şey var ama kesinlikle kaldırılacağı için kullanmaktan vazgeçiyor.
Binlerce program bu kötü tasarlanmış derslere güveniyor.
Bu tür sınıflar için Java API geliştiricileri böyle bir sinyal vermeyecektir.

Cevabı @EJPgerçekten doğru:

Javadoc'ta bu kadar işaretlenmedikçe ve bitene kadar değil.

Yani, soru onun açısından daha mantıklı olacağını düşünüyorum:
"Biz seçim var, biz kullanmalısınız java.io.Fileveya java.nio.file.Pathyeni gelişmeler için cevap ise java.nio.file.Pathkolaylıkla yararlanabilir, java.io.Fileeski projeleri kullanmak için java.io.File?"

Bir java.nio.file.Path dosyasının bir java.io.File'ın yapabileceği her şeyi yapabileceğine ve daha fazlasına inanıyorum.

Cevabınız var.

Eski ES ile ilgili bu kehanet öğretmeni düşüncelerinizi doğrular.

Java SE 7 sürümünden önce, java.io.Filesınıf dosya G / Ç için kullanılan mekanizmadır, ancak birkaç dezavantajı vardı.

Birçok yöntem başarısız olduklarında istisna atmadı, bu nedenle yararlı bir hata mesajı almak imkansızdı. Örneğin, bir dosya silme başarısız olursa, program "silme hatası" alır, ancak dosyanın bulunmadığından, kullanıcının izinleri olmadığından veya başka bir sorundan kaynaklanıp kaynaklanmadığını bilmez.

Yeniden adlandırma yöntemi platformlar arasında tutarlı bir şekilde çalışmadı. Sembolik bağlantılar için gerçek bir destek yoktu.

Dosya verileri, dosya sahibi ve diğer güvenlik öznitelikleri gibi meta veriler için daha fazla destek istendi.

Dosya meta verilerine erişim yetersizdi.

Dosya yöntemlerinin çoğu ölçeklendirilmedi. Bir sunucu üzerinden büyük bir dizin listesinin istenmesi askıda kalmaya neden olabilir. Büyük dizinler de bellek kaynağı sorunlarına neden olarak hizmet reddine neden olabilir.

Dairesel sembolik bağlantılar varsa, bir dosya ağacında özyinelemeli olarak yürüyebilen ve uygun şekilde yanıt verebilecek güvenilir bir kod yazmak mümkün değildi.

Pek çok dezavantajı ile java.io.File, bu sınıfı yeni gelişmeler için kullanmak için gerçekten hiçbir nedene ihtiyacımız yok.
Ve eski kod java.io.Filekullanımı için bile , Oracle kullanmak için ipuçları verir Path.

Belki de java.io.File kullanan ve kodunuz üzerinde minimum etkiye sahip java.nio.file.Path işlevinden yararlanmak isteyen eski bir kodunuz vardır.

Java.io.File sınıfı, eski stil File örneğini java.nio.file.Path örneğine aşağıdaki gibi dönüştüren toPath yöntemini sağlar:

Path input = file.toPath();

Daha sonra Path sınıfının kullanabileceği zengin özellik kümesinden yararlanabilirsiniz.

Örneğin, bir dosyayı silmiş bazı kodlarınız olduğunu varsayalım:

file.delete();

Aşağıdaki gibi Files.delete yöntemini kullanmak için bu kodu değiştirebilirsiniz:

Path fp = file.toPath();
Files.delete(fp);

Kısacası, istediği takdirde hakaretsiz olduğunu düşünebilir .
mike kemirgen

erkek kemirgen. Kesinlikle. Kavramsal olarak Javadoc açısından durum böyle olmasa da açıklamalı nedenlerle olmalıdır.
davidxxx

4

Evet, ancak Java7'nin kendi standart API'leri dahil olmak üzere mevcut birçok API hala yalnızca türle çalışır File.


8
Path nesneleri Path.toFile () kullanılarak File nesnelerine dönüştürülebilir , ardından standart API'ler kullanılabilir.
jacktrades

2
Yani cevabınız 'evet ama hayır' mı?
Lorne Marquis

1

Java.io.File kullanımdan kaldırıldı. Evet java.nio.file.Path daha iyidir, ancak Java.io.File kullanan hala çok sayıda program ve ders kitabı olduğu sürece, sadece eski nedenlerden dolayı, kullanımdan kaldırılmış olarak düşünülmemelidir, çok önemlidir. Bunu yapmak, sadece kazanç elde etmek için eserlere bir anahtar atmak olacaktır. Örneğin, Android çerçevesi bazı temel dosya işleme özellikleri için Dosya'yı kullanır, diğer birçok şey bunu yapar.


Daha Pathiyi olup olmadığını sormadı . Kullanımdan Filekaldırılıp bırakılmadığını sordu .
Lorne Marquis

1
@EJP Bence biraz fazla bilgiçlik yapıyorsun. OP, java.io.File'ın kullanımdan kaldırılıp kaldırılmadığını sordu ve ben de şöyle cevap verdi. Sadece yorumunu onaylıyordum, oylamaya değmezdi.
Andrew S

-9

Java 7 ile yazılmış yeni uygulamalar için java.io.File nesnesini kullanmak için herhangi bir neden var mı yoksa kullanımdan kaldırılmış olabilir mi?

Bu biraz şöyle diyor: "Napolyon Rusya'yı istila etmeli mi, yoksa Brüksel lahanası gerçekten lezzetli mi?"

Sorunun ikinci kısmına gelince, gerçekten sorunun kaldırıldığını düşünebilirsiniz. Ocak 2018 itibarıyla itiraz edilmiyor. Ama bunu düşünmenizi engelleyecek hiçbir şey yok . Bunun size bu hayatta ya da bir sonrakinde herhangi bir avantaj sağlayacağını söylemek mümkün değildir.


5
Benzetmenizi anlayamıyorum.
Tunaki

Herhangi bir "veya" soru, her ikisi de esasen aynı soruya cevap veren iki mantıksal alternatif sunmalıdır.
mike kemirgen

Maalesef, bu bağlamda oldukça bilgiç geliyor. Fikir "Kullanmak istiyorum File. Evet mi, hayır mı?"
Tunaki

1
Evet, bunun yüklü bir soru olduğunu kabul ediyorum ... özellikle mevcut üçüncü taraf API'larının birçoğu hala kullanıyor File. Yakında ölmeyecek.
Tunaki

3
it isn't deprecated. But there's nothing to stop you *considering* it soLOL.
Don Cheadle
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.