4

ファイルを保存するためのディレクトリが必要ですが、それが存在するかどうかわかりません。
したがって、最初に存在するかどうかを確認し、必要に応じて作成する必要があります。

File saveDir = new File("/tmp/appname/savedir/");
if(!saveDir.exists()){
    saveDir.mkdirs(); 
}

上記のように、質問があります。
メソッド「saveDir.exists()」は、ファイルパスが存在するかどうかを示すブール値を返します。

もちろん、冗長で醜いコードを書いて動作させることもできます。

この目標を達成するためのエレガントなコードを書く方法はありますか?

4

8 に答える 8

8

「冗長な」check-directory-existコードに関する質問ですか、それともディレクトリとすべての欠落している親ディレクトリを作成する必要がありますか?

どちらも、Apache Commons IO の FileUtils を使用して簡単に実行できると思います。

FileUtils.forceMkDir(new File("/some/missing/parent/directory/foo"));
于 2012-08-06T07:26:19.007 に答える
3

事前テストは意味がありません。実際のステータスが変化する可能性のあるタイミングウィンドウを導入するだけなので、それでも間違っている可能性があります. 呼び出しmkdirs()て、返された結果をテストするだけです。false の場合は何もしません。true の場合、それは何かを行いました。それが正確に何をしたかは、実際の関心事ではありません。

于 2012-08-06T09:16:24.267 に答える
3

エレガンスは主観的なものですが、ディレクトリが実際に作成されているかどうかを確認したい場合は、 の戻り値も確認してくださいFile.mkdirs()。返さfalseれた場合、それを処理する方法 (例外をスローするなど) はアプリケーションによって異なります。

于 2012-08-06T07:01:54.633 に答える
2

ファイルを保存し、同時に必要なすべてのディレクトリを自動的に作成するユーティリティ クラスに静的メソッドを作成します。ユーティリティ メソッド内のコードは少し冗長かもしれませんが、このようにして、高レベルのアプリケーション ロジックからその醜く冗長なコードを除外することができます。また、将来のプロジェクトでは、いつでもユーティリティを再利用できます。このコードをユーティリティ メソッドに分割すると、分離して簡単にテストできます。

詳細で低レベルのコードをあちこちに混在させるのではなく、ユーティリティを構築してから、ユーティリティを使用して実際のアプリケーションを構築するという観点から考えるようにしてください。あなたが書いたユーティリティは、後のプロジェクトで役に立つかもしれませんが、それが第一の目標ではありません: 1 つのプロジェクトでユーティリティ メソッドを使用するだけで、上位レベルのコードの1か所からしか呼び出されない場合でも、それは依然として有効です。高レベルのコードをより明確にするのに役立つなら、それだけの価値があります。この概念を理解するのにどの本が役立ったかは覚えていません。それはカーニハンとパイクによるプログラミングの実践、またはレイモンドによるUNIXプログラミングの芸術、またはLispについてであったかもしれませんGraham -- またはおそらく 3 つすべて。(もちろん、言語の標準ライブラリを理解することも重要です。そのため、既に作成されているユーティリティを作成し始める必要はありません。)

于 2012-08-06T07:17:19.717 に答える
1

@stephanが彼の答えで述べたように

エレガンスは主観的なものです

しかし、あなたがそれを求めたので

import java.io.File;

public class FileBuilder {
    File file;

    public FileBuilder(String path) {
        file = new File(path);
    }

    public FileBuilder createIfDirDoesNotExists() {
        if (!file.exists()) {
            file.mkdirs();
        }
        return this;
    }

    public File getFile() {
        return file;
    }
}

その後、あなたはすることができます

class test {
    public test() {
        File file = new FileBuilder("/tmp/appname/savedir/").createIfDirDoesNotExists().getFile();
    }
}
于 2012-08-06T07:08:08.927 に答える
0
 File dir = new File(dirPath);
 if(!dir.exists())
     if(!dir.mkdirs()) {//throw or handle exception here.}

File.mkdirs() 中にスローされる可能性のある SecurityException をスローまたは処理する必要があります。

于 2013-01-09T06:39:26.853 に答える
-1

file.exists() は、ディレクトリまたはファイルが存在するかどうかを返します。isDirectory() を使用して、ファイル パスがディレクトリかどうかを確認することもできます。

if (file.isDirectory()){
      //do somethign because this directory already exists
}
else if (file.isFile()){
      //do somethign because this file already exists
}
else {
     boolean created = file.mkdirs();
     if (!created) {
        throw new IOException("Cannot create directory " + file);
     }
}

これがどれほどエレガントであるかについては....私はそれをutilメソッドに個人的にラップして、この余分な粗雑なJavaの一部を非表示にします。

于 2013-04-04T19:34:03.357 に答える