ファイルまたはディレクトリがJavaに存在するかどうかを確認します

1。概要

このクイックチュートリアルでは、ファイルまたはディレクトリの存在を確認するさまざまな方法について説明します。

まず、最新のNIO APIから始めて、次にレガシーIOアプローチについて説明します。

2.java.nio.file.Filesを使用する

ファイルまたはディレクトリが存在するかどうかを確認するには、Files.exists(Path)メソッドを利用できます。メソッドのシグネチャから明らかなように、最初に目的のファイルまたはディレクトリへのパスを取得する必要があります。次に、そのパスFiles.exists(Path)メソッドに渡すことができます。

Path path = Paths.get("does-not-exist.txt"); assertFalse(Files.exists(path));

ファイルが存在しないため、falseを返しますFiles.exists(Path)メソッドでIOExceptionが発生した場合もfalseが返されることにも言及しておく価値があります。

一方、指定されたファイルが存在する場合、期待どおりにtrueが返されます

Path tempFile = Files.createTempFile("baeldung", "exist-article"); assertTrue(Files.exists(tempFile));

ここでは、一時ファイルを作成してから、Files.exists(Path)メソッドを呼び出しています。

これはディレクトリでも機能します:

Path tempDirectory = Files.createTempDirectory("baeldung-exists"); assertTrue(Files.exists(tempDirectory));

ファイルまたはディレクトリが存在するかどうかを具体的に知りたい場合は、Files.isDirectory(Path)またはFiles.isRegularFile(Path)メソッドを使用することもできます。

assertTrue(Files.isDirectory(tempDirectory)); assertFalse(Files.isDirectory(tempFile)); assertTrue(Files.isRegularFile(tempFile));

ありnotExists(パス)を返すメソッド与えられた場合のパスは存在しませんが。

assertFalse(Files.notExists(tempDirectory));

必要なファイル権限がないため、Files.exists(Path)falseを返すことがあります。このようなシナリオでは、Files.isReadable(Path)メソッドを使用して、現在のユーザーがファイルを実際に読み取れることを確認できます。

assertTrue(Files.isReadable(tempFile)); assertFalse(Files.isReadable(Paths.get("/root/.bashrc")));

2.1。シンボリックリンク

デフォルトでは、Files.exists(Path)メソッドはシンボリックリンクをたどります。ファイルAにファイルBへのシンボリックリンクがある場合、Files.exists(A)メソッドは、ファイルBがすでに存在する場合にのみtrueを返します

Path target = Files.createTempFile("baeldung", "target"); Path symbol = Paths.get("test-link-" + ThreadLocalRandom.current().nextInt()); Path symbolicLink = Files.createSymbolicLink(symbol, target); assertTrue(Files.exists(symbolicLink));

リンクのターゲットを削除すると、Files.exists(Path)falseを返します

Files.deleteIfExists(target); assertFalse(Files.exists(symbolicLink));

リンクターゲットはもう存在しないため、リンクをたどっても何も発生せず、Files.exists(Path)falseを返します

2番目の引数として適切なLinkOptionを渡すことにより、シンボリックリンクをたどらないことも可能です。

assertTrue(Files.exists(symbolicLink, LinkOption.NOFOLLOW_LINKS));

リンク自体が存在するため、Files.exists(Path)メソッドはtrueを返します。また、Files.isSymbolicLink(Path)メソッドを使用して、パスがシンボリックリンクであるかどうかを確認できます。

assertTrue(Files.isSymbolicLink(symbolicLink)); assertFalse(Files.isSymbolicLink(target));

使い方3. java.io.Fileのを

Java 7または新しいバージョンのJavaを使用している場合は、この種の要件に最新のJava NIOAPIを使用することを強くお勧めします

ただし、ファイルまたはディレクトリがJavaレガシーIOの世界に存在するかどうかを確認するために、Fileインスタンスでexists()メソッドを呼び出すことができます。

assertFalse(new File("invalid").exists());

ファイルまたはディレクトリがすでに存在する場合は、trueを返します

Path tempFilePath = Files.createTempFile("baeldung", "exist-io"); Path tempDirectoryPath = Files.createTempDirectory("baeldung-exists-io"); File tempFile = new File(tempFilePath.toString()); File tempDirectory = new File(tempDirectoryPath.toString()); assertTrue(tempFile.exists()); assertTrue(tempDirectory.exists());

上に示したようにexists()メソッドはそれがファイルであるかディレクトリであるかを気にしません。したがって、それが存在する限り、trueを返します

ISFILE()メソッドは、しかし、戻り指定されたパスが既存のファイルである場合。

assertTrue(tempFile.isFile()); assertFalse(tempDirectory.isFile());

同様に、指定されたパスが既存のディレクトリである場合、isDirectory()メソッドはtrueを返します

assertTrue(tempDirectory.isDirectory()); assertFalse(tempFile.isDirectory());

最後に、canRead()メソッドは、ファイルが読み取り可能である場合にtrueを返します

assertTrue(tempFile.canRead()); assertFalse(new File("/root/.bashrc").canRead());

falseが返され場合、ファイルが存在しないか、現在のユーザーがファイルの読み取り権限を持っていません。

4.結論

この短いチュートリアルでは、ファイルまたはディレクトリがJavaに存在することを確認する方法を説明しました。その過程で、最新のNIOとレガシーIOAP​​Iについて話しました。また、NIOAPIがシンボリックリンクを処理する方法も確認しました。

いつものように、すべての例はGitHubで入手できます。