Javaにファイルが存在するかどうかを確認するにはどうすればよいですか?


842

Javaで読み取るためにファイルを開く前に、ファイルが存在するかどうかを確認するにはどうすればよいですか(Perlに 相当-e $filename)。

SOに関する唯一の同様の質問は、ファイルの書き込みを扱っているため、FileWriterここでは明らかに該当しない質問を使用して回答されました。

可能であれば、「APIを呼び出してファイルを開き、テキストに「ファイルがない」ことを確認する例外がスローされたときにキャッチする」のではなく、実際のAPI呼び出しがtrue / falseを返すことを希望しますが、後者。


3
:また、あなたが適切なファイルのパーミッションをチェックしたいと思うことを追加したい docs.oracle.com/javase/6/docs/api/java/io/File.html java.io.Fileのメソッドを持っているcanReadcanWriteと、canExecuteそれをチェックします。
カークランド2015年

6
これは危険であることに注意してください。ファイルシステムは、「このファイルが存在するか」メソッドが戻った直後など、いつでも変更できます。とにかくそのケースを処理する必要があるので、そのような方法は疑わしい有用性があります。ファイルを開く場合、正しい方法は、ファイル開いて関連する例外を処理することです。
ケビン

1
@kevin良い点ですが、それは私がこれを必要としていた場合にたまたま起こった非並行環境での疑いのないユーティリティです;)
DVK '19

@DVK:プリエンプティブマルチタスクOSで実行していますか?それか、特別に設計されたJavaチップです。前者の場合は、並行環境にいます。他のプロセスがあなたの下からファイルシステムを変更する可能性があります。
ケビン

2
@kevinは重要ではありませんが、個人的な使用のために設計されたシングルスレッドアプリです。その専用ファイルがその下から何らかの方法で作成/変更される可能性は非常に低いです。
DVK 2016

回答:


1342

使用java.io.File

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

15
exists()が誤った結果を返す場合があります。たとえば、NFSファイルシステムを使用している場合、古いファイルハンドルに問題があります:bugs.java.com/bugdatabase/view_bug.do?bug_id=5003595 これはあいまいなものですが、本番環境コードでイライラするバグの原因となっています前。
CAW 2017年

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サンプルにはサブディレクトリが含まれていますか?あなたは、現在のディレクトリを与え、かどうかを尋ねることを意味している場合/pathnew File("file.txt").exists()戻りますtrue正しい完全なパスがある場合/path/to/file.txt(別のファイルがない限り、答えはノーである大きな/path/file.txt存在します)。
マシュー

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
}

との両方がfalse existsnotExists返す場合、ファイルの存在を確認できません。(このパスへのアクセス権がない可能性があります)

pathディレクトリか通常のファイルかを確認できます。

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

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

このJava SE 7チュートリアルを確認してください。


2
新しいFile(path).exists()と比較した利点は何ですか?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が例外をスローするという欠点を持っている
リチャード・

46

Java 8の使用:

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

2
Files.exists()2つの引数を取ります。通常、のようなものが必要になりますFiles.exists(path, LinkOption.NOFOLLOW_LINKS )
マイクC

1
@MikeCどのメソッドが2番目の引数なしで呼び出されるのでしょうか。Docuはそれについての情報すら示していない。
PowerFlower 2017

1
@PowerFlower:Files.exists()メソッドは1つだけです。2番目の引数を渡さなくても、同じメソッドを呼び出します。2番目の引数はvarargs変数で、0個以上のLinkOptionsを渡すことができます。
TK8 2017年

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. Java 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

グーグルで「javaファイルが存在する」の最初のヒット:

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を使用します
誰か誰か

@実際にはString.valueOf()、nullを処理するを使用しています
GreenGiant 2013年

12

しないでください。ただ、キャッチFileNotFoundException.ファイルシステムは、ファイルがとにかく存在するかどうかをテストする必要があります。これらすべてを2回実行しても意味がありません。次のようないくつかの理由で実行できません。

  • コードを倍増
  • タイミングウィンドウのファイルが存在する可能性があることにより、問題あなたが開いたときに、テストではなく、またはその逆、および
  • この質問の存在が示すように、あなたは間違ったテストをして間違った答えを得るかもしれないという事実。

システムを推測してはいけません。それは知っています。そして、将来を予測しようとしないでください。一般的にするかどうかをテストするための最良の方法の任意のリソースが利用可能であるだけで、それを使用しようとすることです。


ファイルが直接場所に配置されているかどうかを1時間ごとに確認したい場合はどうすればよいですか。特定のファイルが特定のドライブにアップロードされているかどうかを確認する必要があるwebMethodsプロジェクトがあります。これはどのように行われますか?たとえば、ファイルがそこにあるかどうかを1時間ごとに確認したいとします。Javaを使用して、おそらく何らかのタイマーでこれを行うクラスを作成できます。
Doug

2
例外をキャッチする方がはるかに高価です。私のテストでは、新しいFile()。exists()のチェックは、FileNotFoundExceptionをキャッチするよりも10倍以上高速でした。したがって、通常はファイルが失われると予想されるシナリオ(ディスクキャッシュなど)がある場合、例外は間違っています。また、システムを推測するのはかっこいいです。
Nick Frolov 14

1
@Gnawer私が提起した問題のいずれにも対処していません。例外は、ファイルを開くことができない場合にのみスローされます。また、1時間に1回の操作では、マイクロ最適化は必要ありません。あなたの最後の文章はナンセンスです。
ローン侯爵

1
@DougHaufの場合、存在を確認した後は何もしないので、問題はありません。しかしOPは、開く前に特に確認するように求めました。この場合、ファイルを開いて試す/キャッチすることをお勧めします。
Dan Passaro 2017

8

私にとっては、Sean AO Harneyが承認した回答と、Cort3zが結果として得たコメントの組み合わせが最良の解決策のようです。

次のスニペットを使用しました:

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

これが誰かを助けることを願っています。


4

私はこのスレッドに少し遅れていることを知っています。しかし、これが私の答えです。Java7以降で有効です。

次のスニペット

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

ファイルが存在しない場合にメソッドisRegularFileが戻るため、完全に満足のいくものfalseです。したがって、かどうかを確認する必要はありませんFiles.exists(...)

他のパラメータは、リンクの処理方法を示すオプションであることに注意してください。デフォルトでは、シンボリックリンクをたどります。

Java Oracleドキュメントから


ソナードキュメントから:Files.existsメソッドは、JDK 8で著しくパフォーマンスが低下し、実際には存在しないファイルをチェックするために使用すると、アプリケーションの速度が大幅に低下する可能性があります。 同じことがのために行くFiles.notExistsFiles.isDirectoryFiles.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、2011

4
彼は私に十分な答えをくれた。
12


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を使用してそれをどのように修正しますか?
ローン侯爵

問題が発生しました。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
}

考慮に入れるために、あなたの答えは、と比較して最高のパフォーマンスを持っているFile.is Exist()か、Files.isRegularFile()JDK 8
クリスティアン・チャパロA.

0

これらの方法を設計する特定の目的があります。ファイルの存在を確認するために誰かを使用することはできません。

  1. ISFILE() :かどうかをテストしたファイルこの抽象パス名が示すが、通常のファイルです。
  2. exists():この抽象パス名が示すファイルまたはディレクトリが存在するかどうかをテストします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.