Java에 파일이 있는지 어떻게 확인합니까?


842

Java 에서 읽기 위해 파일을 열기 전에 파일이 존재하는지 어떻게 확인할 수 있습니까 ( Perl 과 동일 -e $filename)?

SO에 대한 유일한 비슷한 질문 은 파일 작성을 다루므로 FileWriter여기에는 해당되지 않습니다.

가능한 경우 "파일을 열고 텍스트에서 '파일 없음'을 확인하는 예외가 발생하면 catch하는 API 호출과 달리 true / false를 반환 하는 실제 API 호출을 선호 하지만 후자의.


3
또한 적절한 파일 권한을 확인 할 것이라는 점을 추가 할 : docs.oracle.com/javase/6/docs/api/java/io/File.html java.io.File의 메소드를 가지고 canRead, canWrite그리고 canExecute그 확인하기 위해 .
Kirkland

6
이것은 위험하다는 점에 유의해야합니다. 파일 시스템은 "이 파일이 존재합니까?"메소드가 리턴 된 직후를 포함하여 언제든지 변경 될 수 있습니다. 어쨌든 그 경우를 처리해야하기 때문에 그러한 방법은 의심의 여지가 있습니다. 파일을 열 경우 올바른 방법 은 파일열고 관련 예외를 처리하는 것입니다.
케빈

1
@kevin 좋은 지적이지만, 비 동시 환경에서 의심 할 여지가없는 유틸리티입니다.;)
DVK

@DVK : 선점 형 멀티 태스킹 OS에서 실행 중입니까? 그 중 하나이거나 특별히 설계된 Java 칩 입니다. 전자의 경우 동시 환경에 있습니다. 다른 프로세스로 인해 파일 시스템이 변경 될 수 있습니다.
케빈

2
@kevin은 중요하지 않지만 개인 용도로 설계된 단일 스레드 응용 프로그램입니다. 전용 파일이 생성되거나 변경 될 가능성은 매우 낮습니다.
DVK

답변:


1342

사용 java.io.File:

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

15
exist ()가 잘못된 결과를 반환하는 경우가 있습니다. 예를 들어, NFS 파일 시스템을 사용할 때 오래된 파일 핸들에 문제가 있습니다. bugs.java.com/bugdatabase/view_bug.do?bug_id=5003595 다소 모호하지만 프로덕션 코드에서 약간의 버그가 발생했습니다. 전에.
CAW

22
if(f.isFile())대신 사용하십시오 .
레온

1
공백을 피하려면 filePathString.trim ()을 사용해야합니다
Asim

427

isFile()대신에 사용 하는 것이 좋습니다 exists(). 대부분의 경우 경로가 파일이 아닌 파일을 가리키는 지 확인하려고합니다. 그 기억 exists()의 디렉토리 경로 점의 경우 true를 돌려줍니다.

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

new File("C:/").exists() true를 반환하지만 파일로 열고 읽을 수는 없습니다.


1
@ ylun.ca이 예에는 하위 디렉토리가 포함되어 있습니까? 당신의 현재 디렉토리를 주어진 여부를 물어 의미하는 경우 /path, new File("file.txt").exists()반환 true올바른 전체 경로 인 경우 /path/to/file.txt(다른 파일이없는 한, 대답은 큰 아니오는 /path/file.txt존재한다).
Matthew 읽기

149

Java SE 7에서 nio를 사용하여

import java.nio.file.*;

Path path = Paths.get(filePathString);

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

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

두 경우 existsnotExists반환 허위, 파일의 존재는 확인할 수 없습니다. (이 경로에 대한 액세스 권한이 없을 수 있음)

path디렉토리 또는 일반 파일인지 확인할 수 있습니다 .

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

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

Java SE 7 자습서를 확인하십시오 .


2
new File (path) .exists ()와 비교 한 advatages는 무엇입니까? Palin이 있는지 확인
Raghu K Nair

2
@RaghuKNair java.nio.file.Files.exists()는 (테스트 한 유일한 컴퓨터 : Java 1.7.0_45 x64를 실행하는 Windows Server 2012의 소규모 벤치 마크) 보다 훨씬 빠릅니다 java.io.File.exists().
Matthieu

1
방금 직접 시도해 보았을 때보 다 java.nio.file.Files.exists()5 배 느 렸습니다java.io.File.exists . (Win7 Java 1.7.0_79-x86)
ParkerHalo

또한 문자열이 유효하지 않은 경우 Paths.get에서 예외가 발생한다는 단점이 있습니다.
Richard

46

자바 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); 

실제 파일은 생성되지 않습니다. File 클래스의 객체를 만듭니다. 실제로 파일을 작성하려면 명시 적으로 파일을 작성해야합니다.

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. 자바 7 방식.

    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

구글에서 "자바 파일이 존재"에 대한 첫 번째 히트 :

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를 확인하기 전에 f! = null인지 확인할 필요가 없습니다. 새 키워드가 실패하면 예외가 발생합니다.
Sean AO Harney

f! = null인지 확인하지 않습니다. F + (...)는 java.io.File.toString을 사용
단지 누군가

@just 실제로, 그것은 String.valueOf()null을 처리
하는를

12

하지마 그냥 잡을 FileNotFoundException.파일이 어쨌든 존재하는지 여부를 파일 시스템 테스트에 있습니다. 다음과 같은 두 가지 작업을 수행 할 필요가 없으며 몇 가지 이유가 없습니다.

  • 코드를 두 배로
  • 당신이 테스트 할 때 타이밍 창 문제는 이에 파일이있을 수 있지만 열거 나하지 않을 경우 반대 부사장,
  • 이 질문의 존재가 보여 주듯이, 당신은 틀린 시험을하고 틀린 답을 얻을 수 있다는 사실.

시스템을 추측하지 마십시오. 알고 있습니다. 미래를 예측하려고하지 마십시오. 일반적으로 여부를 테스트하는 가장 좋은 방법은 어떤 자원을 사용할 수는 단지 그것을 사용하려고하는 것입니다.


파일이 직접 위치에 저장되어 있는지 확인하기 위해 1 시간마다 확인하려면 어떻게해야합니까? 특정 파일이 특정 드라이브에 업로드되었는지 확인 해야하는 webMethods 프로젝트가 있습니다. 이것이 어떻게 이루어질 것입니까? 매 시간마다 파일이 있는지 확인하고 싶다고 가정 해 봅시다. Java를 사용하여 일종의 타이머 로이 작업을 수행하는 클래스를 작성할 수 있습니다.
Doug Hauf

2
예외를 잡는 것이 훨씬 비쌉니다. 내 테스트에서 새 File (). exists () 확인이 FileNotFoundException을 잡는 것보다 10 배 이상 빠릅니다. 따라서 파일이 일반적으로 누락 될 것으로 예상되는 시나리오 (예 : 디스크 캐시)가있는 경우 예외가 잘못되었습니다. 또한 시스템을 추측하는 것은 시원합니다.
Nick 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
}

파일이 존재하지 않으면 메서드가 isRegularFile반환 되므로 완벽하게 만족 false합니다. 따라서를 확인할 필요가 없습니다 Files.exists(...).

다른 매개 변수는 링크 처리 방법을 나타내는 옵션입니다. 기본적으로 심볼릭 링크가 따릅니다.

Java Oracle 문서에서


소나 문서에서 : Files.exists 메소드는 JDK 8에서 눈에 띄게 성능이 떨어지며 실제로 존재하지 않는 파일을 검사하는 데 사용될 때 응용 프로그램을 크게 느리게 할 수 있습니다. 동일은 간다 Files.notExists, Files.isDirectory그리고 Files.isRegularFile. 이에 대한 가장 좋은 대안은 다음과 같습니다path.toFile().exists()
Genaut

4

또한 가공 Fileutils의에 익숙해지고 잘 가치 https://commons.apache.org/proper/commons-io/javadocs/api-2.5/org/apache/commons/io/FileUtils.html 이 파일을 관리하고 추가 방법이있다 종종 JDK보다 낫습니다.


19
질문에 대답하지 않는 방법. 커먼즈에 유용한 정보가 많이 있다는 데 동의하지만 한 걸음 더 나아가 OP가 요청한 질문에 대한 답변을 제공 할 수 있습니다.
demongolem

4
그는 나에게 충분한 답변을 주었다.
12:14에 괴롭힘


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

String과 함께 File 생성자를 사용하지 마십시오.
작동하지 않을 수 있습니다!
이 대신 URI를 사용하십시오.

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

왜 안될까요? 그리고 URI를 사용하면 어떻게 해결됩니까?
user207421

문제가있었습니다. f.exists ()가 true이고 파일 내용을 얻을 수도 있습니다. 문제는 경로가 잘못되었지만 파일 이름은 정상입니다. 심지어 이것은 다른 파일이었습니다. 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
}

JDK 8 과 비교하여 File.is Exist()또는 Files.isRegularFile()JDK 8
Cristian Chaparro A.에서

0

이러한 방법을 설계하는 구체적인 목적이 있습니다. 우리는 파일의 존재 여부를 확인하기 위해 누군가를 사용한다고 말할 수 없습니다.

  1. ISFILE () 다음 여부를 테스트 파일 이 추상 패스 명이 나타내는 정상적인 파일입니다.
  2. exist () : 이 추상 경로명이 나타내는 파일 또는 디렉토리 가 존재 하는지 테스트합니다 . 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.