0

C: ドライブのすべてのファイルとフォルダー名を ArrayList に追加するプログラムを作成しようとしています。コードは正常に動作しますが、大量の再帰が原因で、非常に遅くなります。コードは次のとおりです。

public static void updateFileDataBase()
{
    ArrayList<String> currentFiles = new ArrayList<String>();
    addEverythingUnder("C:/",currentFiles,new String[]{"SteamApps","AppData"});
    for(String name : currentFiles)
        System.out.println(name);
}
private static void addEverythingUnder(String path, ArrayList<String> list, String[] exceptions)
{
    System.gc();
    System.out.println("searching " + path);
    File search = new File(path);
    try
    {
        for(int i = 0; i < search.list().length; i++)
        {
            boolean include = true;
            for(String exception : exceptions)
                if(search.list()[i].contains(exception))
                    include = false;
            if(include)
            {
                list.add(search.list()[i]);
                if(new File(path + "/" + search.list()[i]).isDirectory())
                {
                    addEverythingUnder(path + "/" + search.list()[i],list,exceptions);
                }
            }
        }
    }
    catch(Exception error)
    {
        System.out.println("ACCESS DENIED");
    }
}

プロセスをスピードアップするために何かできることはないかと考えていました。前もって感謝します :)

4

4 に答える 4

5

(Java 7 の時点で) これを行う組み込みの方法であるFiles.walkFileTreeがあり、これははるかに効率的で、車輪を再発明する必要がなくなります。見つかったエントリごとにFileVisitorを呼び出します。FileVisitor ページには、開始するための例がいくつかあります。

于 2013-05-16T04:38:22.413 に答える
5

再帰によりプログラムが遅くなる

いいえ、そうではありません。再帰は物事を遅くしません。貧弱なアルゴリズムと不適切なコーディングは、物事を遅くします。

たとえば、処理するファイルごとにFiles.list() 4 回、ディレクトリごとに 1 回呼び出しているとます。ディレクトリごとに1回行うことで、O(N)を保存できます。

   for(File file : search.listFiles())
    {
        String name = file.getName();
        boolean include = true;
        for(String exception : exceptions)
            if(name.contains(exception))
                include = false;
        if(include)
        {
            list.add(name);
            if(file.isDirectory())
            {
                addEverythingUnder(file,list,exceptions);
            }
        }
    }
于 2013-05-16T04:01:20.090 に答える
2

車輪を再発明する特定の理由はありますか? よろしければご利用ください

http://commons.apache.org/proper/commons-io/apidocs/org/apache/commons/io/FileUtils.html#listFiles(java.io.File , java.lang.String[], boolean)

于 2013-05-16T03:55:59.503 に答える