ฉันจะตรวจสอบว่าไฟล์มีอยู่ใน Java ได้อย่างไร?


842

ฉันจะตรวจสอบว่ามีไฟล์อยู่ก่อนเปิดเพื่ออ่านในJava (เทียบเท่าของPerl -e $filenameหรือไม่)

คำถามที่คล้ายกันเพียงข้อเดียวเกี่ยวกับ SOเกี่ยวข้องกับการเขียนไฟล์และได้รับคำตอบดังนั้นการใช้FileWriterซึ่งเห็นได้ชัดว่าไม่สามารถใช้ได้ที่นี่

ถ้าเป็นไปได้ฉันต้องการโทรAPIจริงกลับจริงหรือเท็จซึ่งตรงข้ามกับ "Call API เพื่อเปิดไฟล์และจับเมื่อมันโยนข้อยกเว้นที่คุณตรวจสอบ 'ไม่มีไฟล์' ในข้อความ" แต่ฉันสามารถอยู่กับ หลัง.


3
นอกจากนี้ยังต้องการเพิ่มที่คุณต้องการในการตรวจสอบสิทธิ์ของแฟ้มที่เหมาะสม: docs.oracle.com/javase/6/docs/api/java/io/File.html java.io.File มีวิธีการcanRead, canWriteและcanExecuteเพื่อตรวจสอบว่า .
เคิร์กแลนด์

6
ควรสังเกตว่าสิ่งนี้เป็นอันตราย ระบบไฟล์สามารถเปลี่ยนแปลงได้ตลอดเวลารวมถึงหลังจากวิธีการ "ไม่มีไฟล์นี้อยู่" ของคุณส่งคืน เนื่องจากคุณต้องจัดการกับกรณีดังกล่าวอยู่แล้ววิธีการดังกล่าวจึงเป็นประโยชน์ที่น่าสงสัย หากคุณกำลังจะเปิดไฟล์วิธีที่ถูกต้องคือเปิดไฟล์และจัดการข้อยกเว้นที่เกี่ยวข้อง
เควิน

1
@ kevin เป็นจุดที่ดี แต่มันเป็นประโยชน์ที่ไม่ต้องสงสัยในสภาพแวดล้อมที่ไม่พร้อมกันซึ่งเกิดขึ้นเป็นกรณีที่ฉันต้องการสิ่งนี้ใน)
DVK

@DVK: คุณใช้ระบบปฏิบัติการมัลติทาสกิ้งแบบ preemptively หรือไม่? ทั้งที่หรือมันเป็นชิป Java ออกแบบมาเป็นพิเศษ หากก่อนหน้านี้คุณอยู่ในสภาพแวดล้อมที่เกิดขึ้นพร้อมกัน กระบวนการอื่นสามารถเปลี่ยนระบบไฟล์ออกจากภายใต้คุณ
เควิน

2
@ เควินไม่สำคัญ แต่เป็นแอพพลิเคชั่นแบบเธรดเดียวที่ออกแบบมาเพื่อการใช้งานส่วนตัว โอกาสที่ไฟล์เฉพาะจะถูกสร้าง / เปลี่ยนแปลงจากภายใต้มันจะต่ำอย่างไม่น่าเชื่อ
DVK

คำตอบ:


1342

การใช้java.io.File:

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

15
มีบางกรณีที่มีอยู่ () จะส่งคืนผลลัพธ์ที่ไม่ถูกต้อง ตัวอย่างเช่นเมื่อใช้ระบบไฟล์ NFS มีปัญหาเกี่ยวกับการจัดการไฟล์เก่า: bugs.java.com/bugdatabase/view_bug.do?bug_id=5003595 มันค่อนข้างคลุมเครือ แต่เป็นสาเหตุของข้อบกพร่องที่น่าผิดหวังในรหัสการผลิต ก่อน.
CAW

22
ใช้if(f.isFile())แทน
Leon

1
อย่าลืมใช้ filePathString.trim () เพื่อหลีกเลี่ยงช่องว่างสีขาว
Asim

427

ฉันจะแนะนำให้ใช้แทนisFile() exists()เวลาส่วนใหญ่ที่คุณต้องการตรวจสอบว่าพา ธ ชี้ไปที่ไฟล์ไม่ใช่แค่ไฟล์นั้นมีอยู่จริงหรือไม่ โปรดจำไว้ว่าexists()จะส่งคืนจริงหากเส้นทางของคุณชี้ไปที่ไดเรกทอรี

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

new File("C:/").exists() จะกลับมาจริง แต่จะไม่อนุญาตให้คุณเปิดและอ่านจากมันเป็นไฟล์


1
@ ylun.ca ตัวอย่างมีไดเรกทอรีย่อยอยู่ใช่ไหม ถ้าคุณหมายถึงถามว่าได้รับไดเรกทอรีปัจจุบันของ/path, new File("file.txt").exists()จะกลับtrueถ้าเส้นทางแบบเต็มที่ถูกต้องคือ/path/to/file.txtคำตอบคือไม่ใหญ่ (ยกเว้นกรณีที่ไฟล์อื่น/path/file.txtมี)
Matthew อ่าน

149

โดยใช้ nio ใน 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
}

หากทั้งสองexistsและnotExistsส่งกลับเท็จการมีอยู่ของไฟล์ไม่สามารถตรวจสอบได้ (อาจไม่มีสิทธิ์เข้าถึงเส้นทางนี้)

คุณสามารถตรวจสอบว่าpathเป็นไดเรกทอรีหรือไฟล์ปกติ

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

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

โปรดตรวจสอบการสอน Java SE 7นี้


2
advatages คืออะไรเมื่อเทียบกับไฟล์ใหม่ (เส้นทาง) .exists () ตรวจสอบ Palin ได้แล้ว
Raghu K Nair

2
@RaghuKNair java.nio.file.Files.exists()เป็นจำนวนมากได้เร็วกว่าjava.io.File.exists()(จากมาตรฐานขนาดเล็กของฉันบนคอมพิวเตอร์เครื่องเดียวที่ฉันทดสอบ: Windows Server 2012 เรียกใช้ Java 1.7.0_45 x64)
Matthieu

1
ฉันแค่พยายามมันเองและjava.nio.file.Files.exists()เป็น 5 ครั้งช้าjava.io.File.existsกว่า (Win7 Java 1.7.0_79 - x86)
ParkerHalo

นอกจากนี้ยังมีข้อเสียที่ Paths.get พ่นยกเว้นถ้าสตริงไม่ถูกต้อง
ริชาร์ด

46

ใช้ Java 8:

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

2
Files.exists()ใช้เวลาสองข้อโต้แย้ง Files.exists(path, LinkOption.NOFOLLOW_LINKS )โดยปกติแล้วคุณจะต้องการสิ่งที่ต้องการ
Mike C

1
@ MikeC ฉันสงสัยว่าวิธีการใดที่ถูกเรียกโดยไม่มีอาร์กิวเมนต์ที่สอง Docu ไม่แม้แต่จะแสดงข้อมูลใด ๆ เกี่ยวกับเรื่องนั้น
PowerFlower

1
@PowerFlower: มีเพียงวิธีเดียวคือ Files.exists () โดยไม่ผ่านการโต้แย้งที่สองก็ยังคงเรียกวิธีการเดียวกัน อาร์กิวเมนต์ที่สองคือตัวแปร varargs และสามารถผ่าน 0 หรือมากกว่า LinkOptions
TK8

27
File f = new File(filePathString); 

สิ่งนี้จะไม่สร้างไฟล์ที่มีอยู่จริง จะสร้างวัตถุของคลาสไฟล์ ในการสร้างไฟล์ทางกายภาพคุณต้องสร้างมันอย่างชัดเจน:

f.createNewFile();

ดังนั้นf.exists()สามารถใช้เพื่อตรวจสอบว่าไฟล์ดังกล่าวมีอยู่หรือไม่



16

มีหลายวิธีในการบรรลุเป้าหมายนี้

  1. ในกรณีของการดำรงอยู่เพียงเพื่อ อาจเป็นไฟล์หรือไดเรกทอรี

    new File("/path/to/file").exists();
  2. ตรวจสอบไฟล์

    File f = new File("/path/to/file"); 
      if(f.exists() && f.isFile()) {}
  3. ตรวจสอบไดเรกทอรี

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

    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

การเข้าชมครั้งแรกของ "ไฟล์ java มีอยู่" บน 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 "));
    }
}

1
ไม่จำเป็นต้องตรวจสอบว่า f! = null ก่อนทำการตรวจสอบ f.exists หรือไม่หากคำหลักใหม่ล้มเหลวคำหลักนั้นจะสร้างข้อยกเว้น
Sean AO Harney

ไม่มีการตรวจสอบว่า f! = null f + (... ) ใช้ java.io.File.toString
ใครบางคน

@just จริงมันใช้String.valueOf()ซึ่งจัดการ nulls
GreenGiant

12

อย่า เพียงแค่จับFileNotFoundException.ระบบไฟล์จะต้องทดสอบว่าไฟล์นั้นมีอยู่แล้ว ไม่มีประโยชน์ที่จะทำทั้งหมดสองครั้งและหลายเหตุผลที่ไม่ควรทำเช่น:

  • เพิ่มรหัสเป็นสองเท่า
  • ปัญหาหน้าต่างเวลาที่ไฟล์อาจมีอยู่เมื่อคุณทดสอบ แต่ไม่เมื่อคุณเปิดหรือในทางกลับกันและ
  • ความจริงที่ว่าเมื่อคำถามนี้ปรากฏคุณอาจทำการทดสอบผิดและได้รับคำตอบที่ผิด

อย่าพยายามเดาระบบเป็นครั้งที่สอง มันรู้ และอย่าพยายามทำนายอนาคต โดยทั่วไปวิธีที่ดีที่สุดในการทดสอบว่ามีทรัพยากรใด ๆอยู่หรือไม่เพียงลองใช้งาน


จะเกิดอะไรขึ้นถ้าฉันต้องการตรวจสอบทุก ๆ ชั่วโมงเพื่อดูว่ามีการฝากไฟล์ไว้ในสถานที่โดยตรงหรือไม่ ฉันมีโครงการ webMethods ที่ต้องตรวจสอบเพื่อดูว่ามีการอัพโหลดไฟล์เฉพาะไปยังไดรฟ์หนึ่งหรือไม่ สิ่งนี้จะเกิดขึ้นได้อย่างไร สมมติว่าฉันต้องการตรวจสอบทุกชั่วโมงเพื่อดูว่ามีไฟล์อยู่หรือไม่ ฉันสามารถใช้ Java เพื่อเขียนคลาสที่ทำได้ด้วยตัวจับเวลาบางประเภท
Doug Hauf

2
การจับข้อยกเว้นมีราคาแพงกว่ามาก ในการทดสอบของฉันการตรวจสอบไฟล์ใหม่ () มีอยู่ () เร็วกว่าการจับ FileNotFoundException มากกว่า 10 เท่า ดังนั้นหากคุณมีสถานการณ์ที่คาดว่าไฟล์จะหายไป (เช่นดิสก์แคช) ข้อยกเว้นจะผิด นอกจากนี้การคาดเดาระบบที่สองก็ยอดเยี่ยม
นิค Frolov

1
@Gnawer คุณยังไม่ได้ระบุปัญหาใด ๆ ที่ฉันพูดถึง มีข้อผิดพลาดเกิดขึ้นเฉพาะเมื่อไม่สามารถเปิดไฟล์ได้ และการดำเนินงานที่เกิดขึ้นครั้งละหนึ่งชั่วโมงไม่จำเป็นต้องมีการปรับให้เหมาะสมขนาดเล็ก ประโยคสุดท้ายของคุณไร้สาระ
user207421

1
@DougHauf ในกรณีของคุณไม่มีปัญหาเพราะคุณไม่ได้พยายามทำอะไรหลังจากที่คุณตรวจสอบการมีอยู่ แต่ OP ขอให้ตรวจสอบโดยเฉพาะก่อนเปิด ในกรณีนี้จะเป็นการดีกว่าที่จะลอง / เปิดไฟล์
Dan Passaro

8

สำหรับฉันการรวมกันของคำตอบที่ยอมรับโดย Sean AO Harney และความคิดเห็นที่เกิดจาก Cort3z น่าจะเป็นทางออกที่ดีที่สุด

ใช้ตัวอย่างข้อมูลต่อไปนี้:

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

หวังว่านี่จะช่วยคนได้


4

ฉันรู้ว่าฉันสายในหัวข้อนี้ อย่างไรก็ตามนี่คือคำตอบของฉันใช้ได้ตั้งแต่ Java 7 ขึ้นไป

ตัวอย่างต่อไปนี้

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

เป็น satifactory อย่างสมบูรณ์แบบเพราะวิธีการisRegularFileส่งกลับfalseถ้าไฟล์ไม่อยู่ Files.exists(...)ดังนั้นจึงไม่มีความจำเป็นต้องตรวจสอบว่า

โปรดทราบว่าพารามิเตอร์อื่น ๆ เป็นตัวเลือกที่ระบุว่าควรจัดการลิงค์อย่างไร ตามค่าเริ่มต้นลิงก์สัญลักษณ์จะถูกติดตาม

จากเอกสาร Java Oracle


จาก sonar docs: กระบวนการ Files.exists มีประสิทธิภาพต่ำอย่างเห็นได้ชัดใน JDK 8 และสามารถทำให้แอปพลิเคชันช้าลงอย่างมากเมื่อใช้ตรวจสอบไฟล์ที่ไม่มีอยู่จริง สิ่งเดียวกันก็เป็นเช่นFiles.notExistsนั้นFiles.isDirectoryและFiles.isRegularFile. ทางเลือกที่ดีที่สุดคือ:path.toFile().exists()
Genaut

4

นอกจากนี้ยังควรทำความคุ้นเคยกับ Commons FileUtils https://commons.apache.org/proper/commons-io/javadocs/api-2.5/org/apache/commons/io/FileUtils.html นี่เป็นวิธีเพิ่มเติมสำหรับการจัดการไฟล์และ มักจะดีกว่า JDK


19
วิธีที่จะไม่ตอบคำถาม ฉันเห็นด้วยคอมมอนส์มีเนื้อหาที่มีประโยชน์มากมาย แต่บางทีเราสามารถทำขั้นตอนนั้นต่อไปและให้คำตอบสำหรับคำถามที่ OP ถาม
demongolem

4
เขาให้คำตอบสำหรับฉันมากพอ
bulltorious

3

ตัวอย่างเช่นถ้าคุณมีไดเรกทอรีไฟล์และคุณต้องการตรวจสอบว่ามันมีอยู่

File tmpDir = new File("/var/tmp");

boolean exists = tmpDir.exists();

exists จะคืนค่าเท็จหากไฟล์ไม่มีอยู่

แหล่งที่มา: https://alvinalexander.com/java/java-file-exists-directory-exists


2

ตัวอย่างง่าย ๆ ที่มีการเข้ารหัสที่ดีและครอบคลุมทุกกรณี:

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

อ้างอิงและตัวอย่างเพิ่มเติมได้ที่

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


1

หากคุณต้องการตรวจสอบFileในไดเรกทอรีdir

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

และตรวจสอบcheckผลลัพธ์



1

อย่าใช้ตัวสร้างไฟล์กับสตริง
สิ่งนี้อาจไม่ทำงาน!
แทนที่จะใช้ URI นี้:

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

อาจไม่ทำงานทำไมไม่ และการใช้ URI จะแก้ไขได้อย่างไร
user207421

เรามีปัญหา f.exists () เป็นจริงและเราสามารถรับเนื้อหาไฟล์ได้ ปัญหาคือเส้นทางผิด แต่ชื่อไฟล์ก็โอเคแม้จะเป็นไฟล์อื่น การเปลี่ยนการเรียก constructor ด้วย URI แก้ไขปัญหา
iviorel

1

File.exists()เพื่อตรวจสอบว่ามีไฟล์อยู่หรือไม่ก็จะส่งคืนค่าบูลีนเพื่อระบุสถานะการทำงานของเช็ค true ถ้าไฟล์นั้นมีอยู่; false ถ้าไม่มีอยู่

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

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

0

คุณสามารถใช้รหัสต่อไปนี้เพื่อตรวจสอบ:

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

คุณสามารถทำได้ด้วยวิธีนี้

import java.nio.file.Paths;

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

ในการคำนึงถึงคำตอบของคุณมีประสิทธิภาพที่ดีที่สุดเมื่อเทียบกับFile.is Exist()หรือFiles.isRegularFile()ใน JDK 8
Cristian Chaparro A.

0

มีวัตถุประสงค์เฉพาะในการออกแบบวิธีการเหล่านี้ เราไม่สามารถพูดได้ว่าใช้ใครเพื่อตรวจสอบไฟล์ที่มีอยู่หรือไม่

  1. isFile () : ทดสอบว่าไฟล์ที่แสดงด้วยชื่อพา ธ นามธรรมนี้เป็นไฟล์ปกติหรือไม่
  2. มีอยู่ () : ทดสอบว่าไฟล์หรือไดเรกทอรีที่แสดงโดยชื่อพา ธ นามธรรมนี้มีอยู่ docs.oracle.com

-5

หากต้องการตรวจสอบว่ามีไฟล์อยู่หรือไม่ให้นำเข้าไลบรารี 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
}

ที่มา: http://newsdivariotipo.altervista.org/java-come-controllare-se-un-file-esiste/


2
สิ่งนี้ไม่ช่วยอะไรเลย สิ่งที่คุณพูดได้รับการพูดในหลายคำตอบ โปรดอย่าทำเสียงดัง
klutt
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.