Bagaimana cara memeriksa apakah ada file di Jawa?

842

Bagaimana saya bisa memeriksa apakah ada file, sebelum membukanya untuk dibaca di Jawa (setara dengan Perl -e $filename )?

Satu-satunya pertanyaan serupa pada penawaran SO dengan menulis file dan dengan demikian dijawab menggunakan FileWriteryang jelas tidak berlaku di sini.

Jika memungkinkan, saya lebih suka panggilan API asli yang mengembalikan benar / salah sebagai lawan dari beberapa "Panggilan API untuk membuka file dan menangkap ketika itu melemparkan pengecualian yang Anda periksa untuk 'tidak ada file' dalam teks", tapi saya bisa hidup dengan yang terakhir.

DVK
sumber
3
Juga ingin menambahkan bahwa Anda akan ingin memeriksa hak akses file yang sesuai: docs.oracle.com/javase/6/docs/api/java/io/File.html java.io.File memiliki metode canRead, canWritedan canExecuteuntuk memeriksa bahwa .
Kirkland
6
Perlu dicatat bahwa ini berbahaya. Sistem file dapat berubah kapan saja, termasuk tepat setelah metode "apakah file ini ada" kembali. Karena Anda harus menangani kasus itu, metode seperti itu adalah utilitas yang dipertanyakan. Jika Anda akan membuka file, cara yang benar untuk melakukannya adalah membuka file dan menangani pengecualian yang relevan.
Kevin
1
@ Kevin poin yang baik, tapi itu utilitas yang tidak perlu dipertanyakan dalam lingkungan non-bersamaan, yang kebetulan saya membutuhkan ini di;)
DVK
@DVK: Apakah Anda menjalankan OS preemptively multitasked? Entah itu, atau itu adalah chip Java yang dirancang khusus . Jika yang pertama, Anda berada di lingkungan yang berbarengan. Proses lain dapat mengubah sistem file dari bawah Anda.
Kevin
2
@kevin bukan masalah, tapi ini adalah aplikasi berulir tunggal yang dirancang untuk penggunaan pribadi. Kemungkinan file khusus itu akan dibuat / diubah entah dari mana sangat rendah.
DVK

Jawaban:

1342

Menggunakan java.io.File:

File f = new File(filePathString);
if(f.exists() && !f.isDirectory()) { 
    // do something
}
Sean AO Harney
sumber
15
Ada beberapa kasus di mana ada () akan mengembalikan hasil yang salah. Misalnya, ketika menggunakan sistem file NFS ada masalah dengan file basi menangani: bugs.java.com/bugdatabase/view_bug.do?bug_id=5003595 Ini agak tidak jelas, tetapi telah menjadi penyebab beberapa bug yang membuat frustrasi dalam kode produksi sebelum.
CAW
22
Gunakan if(f.isFile())sebagai gantinya.
Leon
1
jangan lupa untuk menggunakan filePathString.trim () untuk menghindari spasi putih
Asim
427

Saya akan merekomendasikan menggunakan isFile()bukan exists(). Sebagian besar waktu Anda mencari untuk memeriksa apakah jalur menunjuk ke file tidak hanya itu ada. Ingat itu exists()akan mengembalikan true jika jalur Anda menunjuk ke direktori.

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

new File("C:/").exists() akan mengembalikan true tetapi tidak akan memungkinkan Anda untuk membuka dan membacanya sebagai file.

Chris Dail
sumber
1
@ ylun.ca Contohnya termasuk subdirektori? Jika Anda bermaksud bertanya apakah, mengingat direktori saat ini /path, new File("file.txt").exists()akan kembali truejika path lengkap yang benar adalah /path/to/file.txt, jawabannya adalah tidak besar (kecuali file lain /path/file.txtada).
Matius Baca
149

Dengan menggunakan nio di Java SE 7,

import java.nio.file.*;

Path path = Paths.get(filePathString);

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

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

Jika keduanya existsdan notExistskembali salah, keberadaan file tidak dapat diverifikasi. (mungkin tidak ada akses langsung ke jalur ini)

Anda dapat memeriksa apakah pathdirektori atau file biasa.

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

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

Silakan periksa tutorial Java SE 7 ini .

Wonil
sumber
2
Apa advatage dibandingkan dengan File (path) .exists () yang baru? Untuk palin ada cek
Raghu K Nair
2
@RaghuKNair java.nio.file.Files.exists()adalah banyak lebih cepat daripada java.io.File.exists()(dari patokan kecil saya di komputer hanya saya diuji: Windows Server 2012 berjalan Java 1.7.0_45 x64).
Matthieu
1
Saya hanya mencobanya sendiri dan java.nio.file.Files.exists()5 kali lebih lambat daripada java.io.File.exists. (Win7 Java 1.7.0_79 - x86)
ParkerHalo
Ini juga memiliki kelemahan bahwa Paths.get melempar pengecualian jika string tidak valid
Richard
46

Menggunakan Java 8:

if(Files.exists(Paths.get(filePathString))) { 
    // do something
}
Wendel
sumber
2
Files.exists()Dibutuhkan dua argumen. Biasanya, Anda akan menginginkan sesuatu seperti Files.exists(path, LinkOption.NOFOLLOW_LINKS ).
Mike C
1
@ MikeC Saya ingin tahu metode mana yang dipanggil tanpa argumen kedua. Docu bahkan tidak menunjukkan informasi tentang itu.
PowerFlower
1
@PowerFlower: Hanya ada satu metode Files.exists (). Tanpa melewati argumen kedua, itu masih memanggil metode yang sama. Argumen kedua adalah variabel varargs dan dapat melewati 0 atau lebih LinkOptions.
TK8
27
File f = new File(filePathString); 

Ini tidak akan membuat file fisik. Hanya akan membuat objek File kelas. Untuk secara fisik membuat file, Anda harus membuatnya secara eksplisit:

f.createNewFile();

Jadi f.exists()dapat digunakan untuk memeriksa apakah file tersebut ada atau tidak.

Rizwan
sumber
25
f.isFile() && f.canRead()
campur aduk
sumber
2
Apakah mutiara -ejuga memastikan bahwa aplikasi "dapat membaca" file?
Penebusan Terbatas
16

Ada beberapa cara untuk mencapai ini.

  1. Dalam hal hanya untuk keberadaan. Itu bisa berupa file atau direktori.

    new File("/path/to/file").exists();
  2. Periksa file

    File f = new File("/path/to/file"); 
      if(f.exists() && f.isFile()) {}
  3. Periksa Direktori.

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

    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
Raghu K Nair
sumber
14

Anda dapat menggunakan yang berikut ini: File.exists()

Francis Upton IV
sumber
14

klik pertama untuk "file java ada" di google:

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 "));
    }
}
hanya seseorang
sumber
1
Tidak perlu memeriksa apakah f! = Null sebelum memeriksa f.exists, jika kata kunci baru gagal, akan menghasilkan Pengecualian.
Sean AO Harney
tidak ada pemeriksaan jika f! = null. f + (...) menggunakan java.io.File.toString
hanya seseorang
@ Cukup sebenarnya, ia menggunakan String.valueOf(), yang menangani nulls
GreenGiant
12

Jangan. Tangkap saja FileNotFoundException.Sistem file harus menguji apakah file itu ada. Tidak ada gunanya melakukan semua itu dua kali, dan beberapa alasan untuk tidak melakukannya, seperti:

  • gandakan kode
  • jendela waktu masalah di mana file mungkin ada saat Anda menguji tetapi tidak ketika Anda membuka, atau sebaliknya, dan
  • fakta bahwa, seperti yang ditunjukkan oleh pertanyaan ini, Anda mungkin melakukan tes yang salah dan mendapatkan jawaban yang salah.

Jangan coba tebak sistemnya. Itu tahu. Dan jangan mencoba memprediksi masa depan. Secara umum cara terbaik untuk menguji apakah setiap sumber daya yang tersedia hanya untuk mencoba untuk menggunakannya.

Marquis dari Lorne
sumber
Bagaimana jika saya ingin memeriksa setiap jam untuk melihat apakah suatu file telah disimpan pada lokasi langsung. Saya memiliki proyek webMethods yang harus memeriksa untuk melihat apakah file tertentu telah diunggah ke drive tertentu. Bagaimana ini akan dilakukan. Katakanlah saya ingin memeriksa setiap jam untuk melihat apakah file tersebut ada di sana. Saya dapat menggunakan Java untuk menulis kelas yang melakukan ini mungkin dengan timer semacam.
Doug Hauf
2
Menangkap pengecualian jauh lebih mahal. Dalam pengujian saya, memeriksa File baru (). Exist () lebih dari 10 kali lebih cepat daripada menangkap FileNotFoundException. Jadi, jika Anda memiliki skenario di mana file biasanya diperkirakan akan hilang (seperti cache disk), pengecualian salah. Juga, menebak-nebak sistemnya keren.
Nick Frolov
1
@Gnawer Anda belum membahas masalah apa pun yang saya ajukan; pengecualian hanya dibuang ketika file tidak dapat dibuka; dan operasi yang terjadi sekali dalam satu jam tidak memerlukan optimasi mikro. Kalimat terakhir Anda tidak masuk akal.
Marquis of Lorne
1
@DougHauf dalam kasus Anda tidak ada masalah karena Anda tidak berusaha melakukan apa pun setelah Anda memeriksa keberadaan. Tetapi OP meminta secara khusus untuk memeriksa sebelum pembukaan. Dalam hal ini lebih baik hanya mencoba / menangkap file yang terbuka.
Dan Passaro
8

Bagi saya kombinasi jawaban yang diterima oleh Sean AO Harney dan komentar yang dihasilkan oleh Cort3z tampaknya menjadi solusi terbaik.

Gunakan cuplikan berikut:

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

Semoga ini bisa membantu seseorang.

Takdir X
sumber
4

Saya tahu saya agak terlambat di utas ini. Namun, inilah jawaban saya, valid sejak Java 7 ke atas.

Cuplikan berikut

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

sangat memuaskan, karena metode isRegularFilekembali falsejika file tidak ada. Karena itu, tidak perlu memeriksa apakahFiles.exists(...) .

Perhatikan bahwa parameter lain adalah opsi yang menunjukkan bagaimana tautan harus ditangani. Secara default, tautan simbolik diikuti.

Dari dokumentasi Java Oracle

avi.elkharrat
sumber
Dari sonar docs: Metode Files.exists memiliki kinerja yang sangat buruk di JDK 8, dan dapat memperlambat aplikasi secara signifikan ketika digunakan untuk memeriksa file yang sebenarnya tidak ada. Hal yang sama berlaku untuk Files.notExists, Files.isDirectorydan Files.isRegularFile. Alternatif terbaik untuk ini adalah:path.toFile().exists()
Genaut
4

Layak juga untuk mengenal Commons FileUtils https://commons.apache.org/proper/commons-io/javadocs/api-2.5/org/apache/commons/io/FileUtils.html Ini memiliki metode tambahan untuk mengelola file dan seringkali lebih baik daripada JDK.

peter.murray.rust
sumber
19
Cara untuk tidak menjawab pertanyaan. Saya setuju commons memiliki banyak hal berguna, tapi mungkin kita bisa mengambil satu langkah lebih jauh dan memberikan jawaban untuk pertanyaan yang diajukan OP.
demongolem
4
Dia memberi cukup jawaban untuk saya.
bulltorious
2

Contoh sederhana dengan praktik pengkodean yang baik dan mencakup semua kasus:

 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);
            }
        }
    }

Referensi dan lebih banyak contoh di

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

Amandeep Singh
sumber
1

Jika Anda ingin memeriksa Filedalam direktoridir

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

dan periksa checkhasilnya

pengguna3618182
sumber
1
new File("/path/to/file").exists(); 

akan melakukan trik

pengguna4833142
sumber
1

Jangan gunakan File constructor dengan String.
Ini mungkin tidak berfungsi!
Alih-alih ini gunakan URI:

File f = new File(new URI("file:///"+filePathString.replace('\\', '/')));
if(f.exists() && !f.isDirectory()) { 
    // to do
}
iviorel
sumber
Mungkin tidak bekerja kenapa tidak? Dan bagaimana cara menggunakan URI memperbaikinya?
Marquis of Lorne
Kami punya masalah. f.exists () benar dan kami bahkan bisa mendapatkan konten file. Masalahnya adalah, jalannya salah tetapi nama file OK, bahkan ini adalah file lain. Mengubah panggilan konstruktor dengan URI, memperbaiki masalahnya.
iviorel
1

File.exists()untuk memeriksa apakah ada file, itu akan mengembalikan nilai boolean untuk menunjukkan status operasi pemeriksaan; true jika file tersebut ada; salah jika tidak ada.

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

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

Anda dapat menggunakan kode berikut untuk memeriksa:

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;
        }
    }
}
Pankti
sumber
0

Anda bisa melakukannya dengan cara ini

import java.nio.file.Paths;

String file = "myfile.sss";
if(Paths.get(file).toFile().isFile()){
    //...do somethinh
}
Rodrigo Pavan
sumber
Mempertimbangkan jawaban Anda memiliki kinerja terbaik dibandingkan dengan File.is Exist()atau Files.isRegularFile()di JDK 8
Cristian Chaparro A.
0

Ada tujuan khusus untuk merancang metode ini. Kami tidak bisa mengatakan menggunakan siapa pun untuk memeriksa file ada atau tidak.

  1. isFile () : Menguji apakah file yang ditandai oleh pathname abstrak ini adalah file normal.
  2. exist () : Menguji apakah file atau direktori yang ditandai oleh pathname abstrak ini ada. docs.oracle.com
Atul Jain
sumber
-5

Untuk memeriksa apakah ada file, cukup impor perpustakaan java.io. *

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
}

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

Yassine
sumber
2
Ini tidak menambah apa pun. Apa yang Anda katakan telah diucapkan dalam beberapa jawaban. Tolong jangan menghasilkan kebisingan.
klutt