Java 7のFiles
クラスを使用すると、一見奇妙な問題が発生します。FileNotFoundException
を回避するために、書き込みを開始する前にディレクトリとファイルが存在することを確認したいと思います。 Javadocs によると、createDirectory
は、「ファイルの存在と、存在しない場合はディレクトリの作成」をチェックします。
それで、最初にチェックする場合、ディレクトリがすでに存在するのに、なぜ次のコードで問題が発生するのですか?
private void writeFile() throws IOException {
// Make sure parent directory and file are ready
File file = "mydirectory/my.file";
File parent = file.getParentFile();
if (parent != null)
Files.createDirectory(parent.toPath()); // Why do I get FileAlreadyExistsException? =[
Files.createFile(file.toPath());
// Do some file writing stuff!
}
「ファイルが存在しない場合は作成する」ことだけができることはわかっていますが、この方法の要点はすべてを処理することだと思いました。
例外データ:
Java.nio.file.FileAlreadyExistsException: mydirectory
at Sun.nio.fs.WindowsException.translateToIOException(Unknown Source)
at Sun.nio.fs.WindowsException.rethrowAsIOException(Unknown Source)
at Sun.nio.fs.WindowsException.rethrowAsIOException(Unknown Source)
at Sun.nio.fs.WindowsFileSystemProvider.createDirectory(Unknown Source)
at Java.nio.file.Files.createDirectory(Unknown Source)
ドキュメント から
public static Path createDirectories(Path dir, FileAttribute<?>... attrs) throws IOException
「最初に存在しないすべての親ディレクトリを作成してディレクトリを作成します。createDirectoryメソッドとは異なり、ディレクトリがすでに存在するために作成できなかった場合でも、例外はスローされません。」
多分あなたはそれを使うことができます
Files.createDirectoryは、実際にディレクトリを作成します->「新しいディレクトリを作成します。...存在しないすべての親ディレクトリを最初に作成する必要がある場合は、createDirectoriesメソッドを使用する必要があります。」
ファイルが存在することを確認したい場合は、file.exists()メソッドを使用してください。
if (!Files.isDirectory(Paths.get(dirpath))) {
System.out.println("Output Files parent path does not exist:"+dirpath);
File file = new File(dirpath);
if (!file.exists()) {
if (file.mkdir()) {
System.out.println("Output files directory is created!");
} else {
System.out.println("Failed to create output directory!");
}
}
}
まずチェックしてから作成!!
public static Path createDirectories(Path dir, FileAttribute<?>... attrs) throws IOException
を使用しましたが、それでもJava.nio.file.FileAlreadyExistsException
既存のファイルの1つがシンボリックリンクだったため。この方法はあまり信頼できません。
Java 7 documentation は、FileAlreadyExistsException
を取得することをすでに述べています。では、何が問題だと思われますか?