-2

問題: 特定のディレクトリ階層がファイル システムに存在することを確認し、存在しない場合は作成する必要があります。

メソッドがあることは知っていますが、そのメソッドFile.mkdirs()のjavadocは、指定されたパスを完了するために必要なディレクトリの一部またはすべての作成に失敗する可能性があることを示しています。

これを回避するために、パスを表す文字列を受け取り、それを個々の部分に解析してArrayList<String>. 2 番目の方法では、各ディレクトリとサブディレクトリが存在することを確認して、ディレクトリを構築します。

問題は、実際のプログラムがループを実行して文字列を個々の部分に分割しようとすると、メモリが不足することです。関数ではないことはわかっています。JUnit テストでは単独で完全に動作し、プログラム自体はあまりメモリを消費しません。この時点では、ディレクトリを設定して「DataBank」クラスに格納しただけです。大したことはなく、一連の文字列を格納するクラスにすぎません。

問題の原因を突き止めたいと思います。コードが停止した時点で有効なさまざまなクラスを返信できます。

ただし、より簡単な解決策は、を使用することFile.mkdirs()です。File.mkdirs()ディレクトリを作成しない原因は何ですか? 権限が不十分なだけでしょうか?

車輪の再発明を試みるのではなく、できればプロセスを簡素化したい. ただし、同時に、プログラムがメモリ不足になってはならないこともわかっています。文字列を保存してファイル操作を実行していますが、それほど集中的なことはしていません。

4

1 に答える 1

1

ただし、より簡単な解決策は、File.mkdirs() を使用することです。File.mkdirs() がディレクトリを作成しない原因は何ですか? 権限が不十分なだけでしょうか?

File.mkdirs()失敗する理由のいずれかで失敗する可能性がありFile.mkdir()ます(親ディレクトリが存在しないために失敗する場合を除く(明らかな理由で))。

Javadocから:

public boolean mkdirs()

必要だが存在しない親ディレクトリを含め、この抽象パス名で指定されたディレクトリを作成します。この操作が失敗した場合、必要な親ディレクトリの作成に成功した可能性があることに注意してください。

mkdirs()太字部分は、への複数回の呼び出しの単なるショートカットである手がかりですmkdir()

これが何をするかmkdirs()ですmkdir()-ディレクトリ階層を効果的に呼び出します:

public boolean mkdirs() {
    if (exists()) {
        return false;
    }
    if (mkdir()) {
        return true;
    }
    File canonFile = null;
    try {
        canonFile = getCanonicalFile();
    } catch (IOException e) {
        return false;
    }

    File parent = canonFile.getParentFile();
    return (parent != null && (parent.mkdirs() || parent.exists()) &&
            canonFile.mkdir());
}
于 2012-06-14T02:47:44.670 に答える