Java'da bir dosyanın olup olmadığını nasıl kontrol edebilirim?


842

Java'da ( Perl'lere eşdeğer -e $filename) okumak üzere açmadan önce bir dosyanın var olup olmadığını nasıl kontrol edebilirim ?

SO ile ilgili tek benzer soru , dosyayı yazmakla ilgilidir ve bu nedenle FileWriterburada geçerli olmayan açık bir şekilde cevaplanmıştır .

Mümkünse, "Dosyayı açmak ve metinde 'dosya yok' 'u kontrol ettiğiniz bir istisna attığında yakalamak için arama API'sının aksine true / false döndüren gerçek bir API çağrısını tercih ederim , ancak yaşayabilirim ikincisi.


3
Ayrıca uygun dosya izinleri kontrol etmek isteyeceği eklemek istiyorum: docs.oracle.com/javase/6/docs/api/java/io/File.html java.io.File yöntemleri vardır canRead, canWriteve canExecutebu kontrol etmek için .
Kirkland

6
Bunun tehlikeli olduğu unutulmamalıdır. Dosya sistemi, "bu dosya var mı" yönteminiz döndükten hemen sonra da dahil olmak üzere herhangi bir zamanda değişebilir. Bu durumu yine de ele almanız gerektiğinden, böyle bir yöntem şüpheli bir yardımcı programdır. Dosyayı açacaksanız, bunu yapmanın doğru yolu dosyayı açmak ve ilgili istisnayı işlemektir.
Kevin

1
@kevin iyi bir nokta, ama buna ihtiyaç duyduğum durumda olan eşzamanlı olmayan ortamda tartışılmaz bir yardımcı program;)
DVK

@DVK: Önceden çok görevli bir işletim sisteminde mi çalışıyorsunuz? Ya bu, ya da özel olarak tasarlanmış bir Java yongası . Birincisi, eşzamanlı bir ortamdasınız. Diğer işlemler dosya sistemini altınızdan değiştirebilir.
Kevin

2
@kevin önemli değil, ancak kişisel kullanım için tasarlanmış tek bir dişli uygulama. Adanmış dosyanın bir şekilde yaratılması / altından değiştirilmesi olasılığı inanılmaz derecede düşüktür.
DVK

Yanıtlar:


1342

Kullanma java.io.File:

File f = new File(filePathString);
if(f.exists() && !f.isDirectory()) { 
    // do something
}

15
Exist () yanlış bir sonuç döndürecek bazı durumlar vardır. Örneğin, bir NFS dosya sistemi kullanırken, eski dosya tanıtıcılarıyla ilgili bir sorun var: bugs.java.com/bugdatabase/view_bug.do?bug_id=5003595 Bu biraz belirsiz, ancak üretim kodundaki bazı sinir bozucu hataların nedeni oldu önce.
CAW

22
if(f.isFile())Bunun yerine kullanın .
Leon

1
boşluklardan kaçınmak için filePathString.trim () öğesini kullanmayı unutmayın
Asim

427

Bunun isFile()yerine kullanmanızı tavsiye ederim exists(). Çoğu zaman yolun bir dosyaya yalnızca var olduğunu işaret etmediğini kontrol etmek istersiniz. Yolunuz exists()bir dizini gösteriyorsa bunun doğru döneceğini unutmayın .

new File("path/to/file.txt").isFile();

new File("C:/").exists() true değerini döndürür ancak dosya olarak açmanıza ve okumanıza izin vermez.


1
@ ylun.ca Örnek alt dizinleri içeriyor mu? Eğer güncel bir dizin verilen olup olmadığını sormak demek durumunda /path, new File("file.txt").exists()geri dönecek truedoğru tam yol olup olmadığını /path/to/file.txt(başka bir dosya sürece, cevap büyük bir hayırdır /path/file.txtvar).
Matthew,

149

Java SE 7'de nio kullanarak,

import java.nio.file.*;

Path path = Paths.get(filePathString);

if (Files.exists(path)) {
  // file exist
}

if (Files.notExists(path)) {
  // file is not exist
}

Her ikisi de existsve notExistsfalse olarak döndürülürse, dosyanın varlığı doğrulanamaz. (belki de bu yola erişim hakkı yoktur)

pathBir dizin veya normal dosya olup olmadığını kontrol edebilirsiniz .

if (Files.isDirectory(path)) {
  // path is directory
}

if (Files.isRegularFile(path)) {
  // path is regular file
}

Lütfen bu Java SE 7 eğitimini kontrol edin .


2
Yeni Dosya (yol) .exists () ile karşılaştırıldığında avantajları nedir? Palin için kontrol edin
Raghu K Nair

2
@RaghuKNair java.nio.file.Files.exists()olan çok daha hızlı java.io.File.exists()(: Java 1.7.0_45 x64 çalıştıran Windows Server 2012 tek bilgisayarda benim küçük kriter I test).
Matthieu

1
Ben de bunu kendim denedim ve java.nio.file.Files.exists()5 kere YAVAŞ daha java.io.File.exists. (Win7 Java 1.7.0_79 - x86)
ParkerHalo

Bu ayrıca, dize geçerli değilse Paths.get'in bir istisna atması dezavantajına sahiptir
Richard

46

Java 8'i kullanma:

if(Files.exists(Paths.get(filePathString))) { 
    // do something
}

2
Files.exists()iki argüman alır. Genellikle, böyle bir şey isteyeceksiniz Files.exists(path, LinkOption.NOFOLLOW_LINKS ).
Mike C

1
@MikeC İkinci argüman olmadan hangi yöntemin çağrıldığını merak ediyorum. Docu bununla ilgili herhangi bir bilgi bile göstermiyor.
PowerFlower

1
@ PowerFlower: Yalnızca bir Files.exists () yöntemi vardır. İkinci argümanı geçmeden hala aynı yöntemi çağırıyor. İkinci argüman varargs değişkenidir ve 0 veya daha fazla LinkOptions iletebilir.
TK8

27
File f = new File(filePathString); 

Bu fiziksel bir dosya oluşturmaz. Sadece File sınıfının bir nesnesini oluşturur. Fiziksel olarak bir dosya oluşturmak için dosyayı açıkça oluşturmanız gerekir:

f.createNewFile();

Böylece f.exists()böyle bir dosyanın var olup olmadığını kontrol etmek için kullanılabilir.



16

Bunu başarmanın birçok yolu vardır.

  1. Sadece varoluş için. Dosya veya dizin olabilir.

    new File("/path/to/file").exists();
  2. Dosyayı kontrol et

    File f = new File("/path/to/file"); 
      if(f.exists() && f.isFile()) {}
  3. Dizin olup olmadığını kontrol edin.

    File f = new File("/path/to/file"); 
      if(f.exists() && f.isDirectory()) {}
  4. Java 7 yolu.

    Path path = Paths.get("/path/to/file");
    Files.exists(path)  // Existence 
    Files.isDirectory(path)  // is Directory
    Files.isRegularFile(path)  // Regular file 
    Files.isSymbolicLink(path)  // Symbolic Link


14

Google'da "java dosyası var" için ilk isabet:

import java.io.*;

public class FileTest {
    public static void main(String args[]) {
        File f = new File(args[0]);
        System.out.println(f + (f.exists()? " is found " : " is missing "));
    }
}

1
F.exists öğesini kontrol etmeden önce f! = Null değerinin kontrol edilmesine gerek yoktur; yeni anahtar kelime başarısız olursa istisna oluşturur.
Sean AO Harney

f! = null olup olmadığını kontrol etmez. f + (...) java.io.File.toString kullanır
sadece birileri

@just aslında, String.valueOf()nulls işleyen kullanır
GreenGiant

12

Yapma. Sadece yakala FileNotFoundException.Dosya sistemi dosyanın zaten var olup olmadığını test etmek zorunda. Tüm bunları iki kez yapmanın bir anlamı yok ve yapmamak için birkaç neden var:

  • kodu ikiye katla
  • dosyanın test ettiğinizde var olabileceği, ancak açtığınızda bulunmayabileceği veya tam tersi olabileceği zamanlama penceresi sorunu ve
  • bu sorunun varlığının gösterdiği gibi, yanlış test yapıp yanlış cevap alabilirsiniz.

Sistemi ikinci olarak tahmin etmeye çalışmayın. Biliyor. Ve geleceği tahmin etmeye çalışmayın. Genel olarak, herhangi bir kaynağın mevcut olup olmadığını test etmenin en iyi yolu, onu kullanmaya çalışmaktır.


Bir dosyanın doğrudan bir konuma bırakılıp bırakılmadığını görmek için her saatte bir kontrol etmek istersem ne olur? Belirli bir sürücünün belirli bir sürücüye yüklenip yüklenmediğini kontrol etmesi gereken bir webMethods projem var. Bu nasıl halledilebilir. Dosyanın orada olup olmadığını görmek için her saat kontrol etmek istediğimi varsayalım. Muhtemelen bir tür bir zamanlayıcı ile bunu yapan bir sınıf yazmak için Java kullanabilirsiniz.
Doug Hauf

2
Bir istisna yakalamak çok daha pahalıdır. Testimde, yeni File () öğesinin kontrol edilmesi FileNotFoundException özelliğinin yakalanmasından 10 kat daha hızlıydı. Bu nedenle, normalde dosyaların eksik olması beklenen bir senaryo varsa (disk önbelleği gibi), istisna yanlıştır. Ayrıca, ikinci tahmin sistemi iyidir.
Nick Frolov

1
@Gnawer Oluşturduğum sorunların hiçbirine değinmediniz; kural dışı durum yalnızca dosya açılamadığında atılır; ve saatte bir yapılan işlemler mikro optimizasyon gerektirmez. Son cümleniz saçmalık.
user207421

1
@DougHauf, varlığınızı kontrol ettikten sonra hiçbir şey yapmaya çalışmadığınız için sorun yok. Ancak OP özellikle açmadan önce kontrol etmesini istedi. Bu durumda dosyayı açmayı denemek / yakalamak daha iyidir.
Dan Passaro

8

Benim için Sean AO Harney'nin kabul ettiği cevabın ve Cort3z tarafından ortaya çıkan yorumun en iyi çözüm olduğu görülüyor.

Aşağıdaki snippet'i kullandı:

File f = new File(filePathString);
if(f.exists() && f.isFile()) {
    //do something ...
}

Umarım bu birine yardımcı olabilir.


4

Bu konuya biraz geç kaldığımı biliyorum. Ancak, Java 7 ve sonrasında geçerli olan cevabım burada.

Aşağıdaki snippet

if(Files.isRegularFile(Paths.get(pathToFile))) {
    // do something
}

mükemmel doyurucudur, çünkü dosya yoksa yöntem isRegularFilegeri döner false. Bu nedenle,Files.exists(...) .

Diğer parametrelerin, bağlantıların nasıl ele alınması gerektiğini belirten seçenek olduğunu unutmayın. Varsayılan olarak, sembolik bağlantılar izlenir.

Java Oracle belgelerinden


Sonar dokümanlarından: Files.exists yöntemi JDK 8'de belirgin bir şekilde düşük performansa sahiptir ve gerçekte mevcut olmayan dosyaları kontrol etmek için kullanıldığında bir uygulamayı önemli ölçüde yavaşlatabilir. Aynı şey Files.notExists, Files.isDirectoryve Files.isRegularFile. bu en iyi alternatiftir:path.toFile().exists()
Genaut



2

İyi kodlama uygulamaları ve tüm vakaları kapsayan basit örnek:

 private static void fetchIndexSafely(String url) throws FileAlreadyExistsException {
        File f = new File(Constants.RFC_INDEX_LOCAL_NAME);
        if (f.exists()) {
            throw new FileAlreadyExistsException(f.getAbsolutePath());
        } else {
            try {
                URL u = new URL(url);
                FileUtils.copyURLToFile(u, f);
            } catch (MalformedURLException ex) {
                Logger.getLogger(RfcFetcher.class.getName()).log(Level.SEVERE, null, ex);
            } catch (IOException ex) {
                Logger.getLogger(RfcFetcher.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

Referans ve diğer örnekler

https://zgrepcode.com/examples/java/java/nio/file/filealreadyexistsexception-implementations


1

FileBir dizinde bir kontrol etmek istiyorsanızdir

String directoryPath = dir.getAbsolutePath()
boolean check = new File(new File(directoryPath), aFile.getName()).exists();

ve checksonucu kontrol et



1

Dize ile Dosya yapıcısını kullanmayın.
Bu işe yaramayabilir!
Bunun yerine URI kullanın:

File f = new File(new URI("file:///"+filePathString.replace('\\', '/')));
if(f.exists() && !f.isDirectory()) { 
    // to do
}

Neden işe yaramayabilir? Ve bir URI kullanmak bunu nasıl düzeltir?
user207421

Bir sorunumuz vardı. f.exists () doğruydu ve dosya içeriğini bile alabiliriz. Sorun şu ki, yol yanlıştı ama dosya adı iyiydi, bu bile başka bir dosyaydı. Yapıcı çağrısını URI ile değiştirmek sorunu çözdü.
iviorel

1

File.exists()bir dosyanın olup olmadığını kontrol etmek için, kontrol işlem durumunu belirtmek üzere bir boole değeri döndürür; dosya varsa true; yoksa yanlış.

File f = new File("c:\\test.txt");

if(f.exists()){
    System.out.println("File existed");
}else{
    System.out.println("File not found!");
}

0

Kontrol etmek için aşağıdaki kodu kullanabilirsiniz:

import java.io.File;
class Test{
    public static void main(String[] args){
        File f = new File(args[0]); //file name will be entered by user at runtime
        System.out.println(f.exists()); //will print "true" if the file name given by user exists, false otherwise

        if(f.exists())
        {
             //executable code;
        }
    }
}

0

Bu şekilde yapabilirsin

import java.nio.file.Paths;

String file = "myfile.sss";
if(Paths.get(file).toFile().isFile()){
    //...do somethinh
}

Cevabınızı hesaba katmak için cevabınız JDK 8File.is Exist()Files.isRegularFile()
Cristian Chaparro A

0

Bu yöntemleri tasarlamak için özel bir amaç vardır. Dosyanın var olup olmadığını kontrol etmek için kimseyi kullanma diyemeyiz.

  1. isFile () : olmadığını test dosya soyut yol adı ile gösterilen normal dosyasıdır.
  2. exist () : Bu soyut yol adıyla belirtilen dosya veya dizinin mevcut olup olmadığını test eder . docs.oracle.com

-5

Bir dosyanın var olup olmadığını kontrol etmek için java.io. * kütüphanesini içe aktarmanız yeterlidir.

File f = new File(“C:\\File Path”);

if(f.exists()){
        System.out.println(“Exists”);        //if file exists
}else{
        System.out.println(“Doesn't exist”);         //if file doesn't exist
}

Kaynak: http://newsdivariotipo.altervista.org/java-come-controllare-se-un-file-esiste/


2
Bu hiçbir şey katmıyor. Söyledikleriniz birkaç cevapta söylendi. Lütfen gürültü üretmeyin.
Klutt
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.