Làm cách nào để kiểm tra xem một tệp có tồn tại trong Java không?


842

Làm cách nào tôi có thể kiểm tra xem một tệp có tồn tại hay không, trước khi mở nó để đọc bằng Java (tương đương với Perl's -e $filename )?

Câu hỏi tương tự duy nhất về SO liên quan đến việc viết tệp và do đó đã được trả lời bằng cách sử dụng FileWriterrõ ràng là không áp dụng ở đây.

Nếu có thể, tôi thích một cuộc gọi API thực trả về đúng / sai thay vì một số "API gọi để mở tệp và bắt khi nó ném một ngoại lệ mà bạn kiểm tra 'không có tệp' trong văn bản", nhưng tôi có thể sống với cái sau


3
Cũng muốn nói thêm rằng bạn sẽ muốn kiểm tra xem có quyền tập tin thích hợp: docs.oracle.com/javase/6/docs/api/java/io/File.html java.io.File có phương pháp canRead, canWritecanExecuteđể kiểm tra mà .
Kirkland

6
Cần lưu ý rằng điều này là nguy hiểm. Hệ thống tệp có thể thay đổi bất cứ lúc nào, bao gồm ngay sau khi phương thức "tệp này tồn tại" của bạn trả về. Vì dù sao bạn cũng phải xử lý trường hợp đó, nên một phương pháp như vậy là tiện ích đáng ngờ. Nếu bạn định mở tệp, cách chính xác để làm như vậy là mở tệp và xử lý ngoại lệ có liên quan.
Kevin

1
@kevin điểm tốt, nhưng đó là tiện ích không thể nghi ngờ trong môi trường không đồng thời, đó là trường hợp tôi cần điều này;)
DVK

@DVK: Bạn có đang chạy trên một hệ điều hành đa nhiệm được ưu tiên không? Hoặc đó hoặc là một con chip Java được thiết kế đặc biệt . Nếu trước đây, bạn đang ở trong một môi trường đồng thời. Các quy trình khác có thể thay đổi hệ thống tập tin từ bên dưới bạn.
Kevin

2
@kevin không quan trọng nhưng đó là một ứng dụng luồng đơn được thiết kế để sử dụng cá nhân. Khả năng tập tin chuyên dụng của nó bằng cách nào đó sẽ được tạo / thay đổi từ bên dưới nó là cực kỳ thấp.
DVK

Câu trả lời:


1342

Sử dụng java.io.File:

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

15
Có một số trường hợp tồn tại () sẽ trả về kết quả không chính xác. Ví dụ: khi sử dụng hệ thống tệp NFS, có một vấn đề với các tệp xử lý cũ: bug.java.com/bugdatabase/view_orms.do?orms_id=5003595 Đó là một loại tối nghĩa, nhưng là nguyên nhân của một số lỗi gây khó chịu trong mã sản xuất trước.
CAW

22
Sử dụng if(f.isFile())thay thế.
Leon

1
nhớ sử dụng filePathString.trim () để tránh các khoảng trắng
Asim

427

Tôi khuyên bạn nên sử dụng isFile()thay vì exists(). Hầu hết thời gian bạn đang tìm kiếm để kiểm tra xem đường dẫn trỏ đến một tệp không chỉ là nó tồn tại. Hãy nhớ rằng exists()sẽ trả về true nếu đường dẫn của bạn trỏ đến một thư mục.

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

new File("C:/").exists() sẽ trả về true nhưng sẽ không cho phép bạn mở và đọc từ đó dưới dạng tệp.


1
@ ylun.ca Ví dụ bao gồm các thư mục con? Nếu bạn muốn hỏi liệu, được cung cấp một thư mục hiện tại của /path, new File("file.txt").exists()sẽ trả về truenếu đường dẫn đầy đủ chính xác /path/to/file.txt, câu trả lời là không lớn (trừ khi có tệp khác /path/file.txttồn tại).
Matthew Đọc

149

Bằng cách sử dụng nio trong 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
}

Nếu cả hai existsnotExiststrả về false, sự tồn tại của tệp không thể được xác minh. (có thể không có quyền truy cập vào đường dẫn này)

Bạn có thể kiểm tra nếu pathlà một thư mục hoặc tập tin thông thường.

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

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

Vui lòng kiểm tra hướng dẫn Java SE 7 này .


2
Các ưu điểm so với File (path) .exists () mới là gì? Đối với một palin tồn tại kiểm tra
Raghu K Nair

2
@RaghuKNair java.nio.file.Files.exists()rất nhiều nhanh hơn java.io.File.exists()(từ benchmark nhỏ của tôi trên máy tính duy nhất tôi thử nghiệm: Windows Server 2012 chạy Java 1.7.0_45 x64).
Matthieu

1
Tôi chỉ thử nó và java.nio.file.Files.exists()đã 5 lần SLOWER hơn java.io.File.exists. (Win7 Java 1.7.0_79 - x86)
ParkerHalo

Điều này cũng có nhược điểm là Paths.get ném ngoại lệ nếu chuỗi không hợp lệ
Richard

46

Sử dụng Java 8:

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

2
Files.exists()mất hai đối số. Thông thường, bạn sẽ muốn một cái gì đó như Files.exists(path, LinkOption.NOFOLLOW_LINKS ).
Mike C

1
@MikeC Tôi tự hỏi phương thức nào được gọi mà không có đối số thứ hai. Các Docu thậm chí không hiển thị bất kỳ thông tin về điều đó.
PowerFlower

1
@PowerFlower: Chỉ có một phương thức Files.exists (). Không vượt qua đối số thứ hai, nó vẫn gọi cùng một phương thức. Đối số thứ hai là biến varargs và có thể truyền 0 hoặc nhiều LinkOptions.
TK8

27
File f = new File(filePathString); 

Điều này sẽ không tạo ra một tập tin vật lý. Sẽ chỉ tạo một đối tượng của Tệp lớp. Để tạo một tập tin vật lý, bạn phải tạo nó một cách rõ ràng:

f.createNewFile();

Vì vậy, f.exists()có thể được sử dụng để kiểm tra xem một tập tin như vậy có tồn tại hay không.



16

Có nhiều cách để đạt được điều này.

  1. Trong trường hợp chỉ để tồn tại. Nó có thể là tập tin hoặc một thư mục.

    new File("/path/to/file").exists();
  2. Kiểm tra hồ sơ

    File f = new File("/path/to/file"); 
      if(f.exists() && f.isFile()) {}
  3. Kiểm tra thư mục.

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

    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

lần truy cập đầu tiên cho "tệp java tồn tại" trên 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
Không cần kiểm tra nếu f! = Null trước khi kiểm tra f.exists, nếu từ khóa mới không thành công, nó sẽ tạo Ngoại lệ.
Sean AO Harney

không có kiểm tra nếu f! = null. f + (...) sử dụng java.io.File.toString
chỉ cần ai đó

@ thực sự, nó sử dụng String.valueOf(), xử lý nulls
GreenGiant

12

Đừng. Chỉ cần bắt FileNotFoundException.hệ thống tập tin phải kiểm tra xem tập tin có tồn tại không. Không có lý do gì để làm tất cả những điều đó hai lần, và một số lý do không nên, chẳng hạn như:

  • nhân đôi mã
  • vấn đề cửa sổ thời gian theo đó tệp có thể tồn tại khi bạn kiểm tra nhưng không phải khi bạn mở hoặc ngược lại
  • thực tế là, như sự tồn tại của câu hỏi này cho thấy, bạn có thể làm bài kiểm tra sai và nhận được câu trả lời sai.

Đừng cố gắng đoán hệ thống. Nó biết. Và đừng cố gắng dự đoán tương lai. Nói chung, cách tốt nhất để kiểm tra xem tài nguyên nào khả dụng hay không chỉ là thử sử dụng nó.


Điều gì xảy ra nếu tôi muốn kiểm tra mỗi giờ để xem liệu một tập tin đã được gửi trên một vị trí trực tiếp. Tôi có một dự án webMethods phải kiểm tra xem một tập tin cụ thể đã được tải lên một ổ đĩa cụ thể chưa. Làm thế nào điều này sẽ được thực hiện. Hãy nói rằng tôi muốn kiểm tra mỗi giờ để xem tập tin có ở đó không. Tôi có thể sử dụng Java để viết một lớp có thể thực hiện điều này với một bộ đếm thời gian.
Doug Hauf

2
Bắt một ngoại lệ là cách đắt hơn. Trong thử nghiệm của tôi, kiểm tra Tệp mới (). Tồn tại () nhanh hơn 10 lần so với việc bắt FileNotFoundException. Vì vậy, nếu bạn có một kịch bản mà các tệp thường bị thiếu (chẳng hạn như bộ đệm đĩa), ngoại lệ là sai. Ngoài ra, đoán thứ hai hệ thống là mát mẻ.
Nick Frolov

1
@Gnawer Bạn chưa giải quyết bất kỳ vấn đề nào tôi nêu ra; ngoại lệ chỉ được ném khi không thể mở tệp; và các hoạt động xảy ra mỗi giờ một lần không yêu cầu tối ưu hóa vi mô. Câu cuối cùng của bạn là vô nghĩa.
Hầu tước Lorne

1
@DougHauf trong trường hợp của bạn không có vấn đề gì vì bạn không cố gắng làm bất cứ điều gì sau khi bạn kiểm tra sự tồn tại. Nhưng OP yêu cầu cụ thể kiểm tra trước khi mở. Trong trường hợp này, tốt hơn là chỉ cần thử / bắt tệp mở.
Dan Passaro

8

Đối với tôi, sự kết hợp giữa câu trả lời được chấp nhận của Sean AO Harney và nhận xét kết quả của Cort3z dường như là giải pháp tốt nhất.

Đã sử dụng đoạn mã sau:

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

Hy vọng điều này có thể giúp ai đó.


4

Tôi biết tôi hơi muộn trong chủ đề này. Tuy nhiên, đây là câu trả lời của tôi, hợp lệ kể từ Java 7 trở lên.

Đoạn mã sau

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

là hoàn toàn satifactory, bởi vì phương thức isRegularFiletrả về falsenếu tập tin không tồn tại. Do đó, không cần kiểm tra nếu Files.exists(...).

Lưu ý rằng các tham số khác là các tùy chọn cho biết cách xử lý các liên kết. Theo mặc định, các liên kết tượng trưng được theo sau.

Từ tài liệu Java Java


Từ tài liệu sonar: Phương thức Files.exists có hiệu năng kém đáng chú ý trong JDK 8 và có thể làm chậm ứng dụng đáng kể khi được sử dụng để kiểm tra các tệp không thực sự tồn tại. Cũng vậy với Files.notExists, Files.isDirectoryFiles.isRegularFile. các lựa chọn tốt nhất cho điều này là:path.toFile().exists()
Genaut

4

Cũng đáng để làm quen với Commons FileUtils https://commons.apache.org/proper/commons-io/javadocs/api-2.5/org/apache/commons/io/FileUtils.html Điều này có các phương pháp bổ sung để quản lý tệp và thường tốt hơn JDK.


19
Cách để không trả lời câu hỏi. Tôi đồng ý commons có rất nhiều công cụ hữu ích, nhưng có lẽ chúng ta có thể tiến thêm một bước nữa và đưa ra câu trả lời cho câu hỏi mà OP đã hỏi.
demongolem

4
Anh ấy đã trả lời đủ cho tôi.
bắt nạt


2

Ví dụ đơn giản với thực hành mã hóa tốt và bao gồm tất cả các trường hợp:

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

Tham khảo và nhiều ví dụ tại

https://zgrepcode.com/examples/java/java/nio/file/filealperedexistsexception-im THỰCations


1

Nếu bạn muốn kiểm tra Filemột thư mụcdir

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

và kiểm tra checkkết quả



1

Không sử dụng Trình tạo tệp với Chuỗi.
Điều này có thể không hoạt động!
Thay vì sử dụng URI:

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

Có thể không làm việc tại sao không? Và làm thế nào để sử dụng một URI sửa lỗi đó?
Hầu tước Lorne

Chúng tôi đã có một vấn đề. f.exists () là đúng và chúng tôi thậm chí có thể lấy nội dung tệp. Vấn đề là, đường dẫn sai nhưng tên tệp vẫn ổn, thậm chí đây là một tệp khác. Thay đổi lệnh gọi hàm tạo với URI, đã khắc phục sự cố.
iviorel

1

File.exists()để kiểm tra nếu một tập tin tồn tại, nó sẽ trả về giá trị boolean để cho biết trạng thái hoạt động kiểm tra; đúng nếu tập tin tồn tại; sai nếu không tồn tại.

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

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

0

Bạn có thể sử dụng mã sau đây để kiểm tra:

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

Bạn có thể làm theo cách này

import java.nio.file.Paths;

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

Để tính đến câu trả lời của bạn có hiệu suất tốt nhất so với File.is Exist()hoặc Files.isRegularFile()trong JDK 8
Cristian Chaparro A.

0

Có mục đích cụ thể để thiết kế các phương pháp này. Chúng tôi không thể nói sử dụng bất cứ ai để kiểm tra tập tin tồn tại hay không.

  1. isFile () : Kiểm tra xem tệp được biểu thị bằng tên đường dẫn trừu tượng này có phải là tệp bình thường hay không.
  2. tồn tại () : Kiểm tra xem tệp hoặc thư mục được biểu thị bằng tên đường dẫn trừu tượng này có tồn tại không. docs.oracle.com

-5

Để kiểm tra xem một tệp có tồn tại hay không, chỉ cần nhập thư viện 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
}

Nguồn: http://newsdivariotipo.altervista.org/java-come-controllare-se-un-file-esiste/


2
Điều này không thêm gì. Những gì bạn nói đã được nói trong một số câu trả lời. Xin đừng tạo ra tiếng ồn.
klutt
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.