12

次のApacheCommonsクラスを使用して、Javaのファイルシステム上のファイルを一覧表示しています。

Collection<File> allFiles = FileUtils.listFiles(rootDirectory, null, recursive);

これは非常に長いプロセスであり、最大5分かかる場合があります。

作成中にコレクションのサイズを確認する方法はありますか?

別のスレッドからアクセスしようとしましたが、プロセスの準備ができるまでゼロになりました。

4

4 に答える 4

11

メソッドから戻り値を取得するまでは、このメソッドが内部で使用する変数にアクセスできないため、データが取り込まれるコレクションにアクセスすることはできません。

再帰フラグを使用せずに検索を細かく分割し、自分で再帰を処理してディレクトリごとのコレクションを受け取ることができます。

Java 7 を使用している場合はFileVisitorインターフェイスを使用してファイル システムを探索することをお勧めします。進行状況を追跡できるコールバック メソッドがいくつかあります。

于 2012-09-03T10:31:05.207 に答える
2

FileUtils IOFileFilter を使用できます。

Collection<File> listFiles = FileUtils.listFiles(new File("."), counter, FileFilterUtils.trueFileFilter());

カウンターがどこにあるのか

IOFileFilter counter = new IOFileFilter() {

    @Override
    public boolean accept(File arg0, String arg1) {
        countCall();
        return true;
    }

    @Override
    public boolean accept(File arg0) {
        countCall();
        return true;
    }
};

countCall は進行状況を更新するメソッドです。

于 2012-09-03T12:08:26.227 に答える
1

これを行う唯一の方法は (java7 や以前に提案されたように作業を分割するのではなく)、コールバックの更新中にファイル システムを検索する独自のコードを記述することです。

のコードを使用しcommons-io、ニーズに合わせて変更しました。明らかにテストが必要ですが、見つかったファイルをカウントします。

interface Counter {
    void foundFile(File file);
}

final class FileSearcher {
    public static Collection<File> listFiles(File root, FileFilter filter, Counter counter) {
        Collection<File> files = new ArrayList<File>();
        File[] found = root.listFiles(filter);

        if (found != null) {
            for (int i = 0; i < found.length; i++) {
                if (found[i].isDirectory()) {
                    files.addAll(listFiles(found[i], filter, counter));
                } else {
                    files.add(found[i]);
                    counter.foundFile(found[i]);
                }
            }
        }

        return files;
    }
}

そして、次のように使用します。

final AtomicInteger inte = new AtomicInteger(0);
FileSearcher.listFiles(new File("C:/"), null, new Counter() {
    @Override
    public void foundFile(File file) {
        System.out.println("found file number " + inte.addAndGet(1));
    }
});
于 2012-09-03T11:47:27.360 に答える
1

リストコマンドの出力を一時ファイルにリダイレクトし、Java File APIを使用してそれを読み取るなど、プラットフォーム固有のコマンドを実行してみることができると思います。

ls > temp.txt

特定のインデックスのファイルを一覧表示する簡単なシェル スクリプトを作成しました。

#!/bin/bash

RANGE_UP=$2
RANGE_BOT=$1

CURRENT_CNTR=0

FILENAME=._m_ls

ls -w 1 > $FILENAME
while read line
do
    if [ $CURRENT_CNTR -le $RANGE_UP -a $CURRENT_CNTR -gt $RANGE_BOT ]; then
    printf $line"\n"
    fi
    CURRENT_CNTR=`expr $CURRENT_CNTR + 1`
done < $FILENAME

次のようなことを実行して、別のスレッドで./ls_range.sh 10000 30000 >temp.txt使用してこのファイルから読み取ることができます。BufferedReader

于 2012-09-03T11:09:19.500 に答える