次のApacheCommonsクラスを使用して、Javaのファイルシステム上のファイルを一覧表示しています。
Collection<File> allFiles = FileUtils.listFiles(rootDirectory, null, recursive);
これは非常に長いプロセスであり、最大5分かかる場合があります。
作成中にコレクションのサイズを確認する方法はありますか?
別のスレッドからアクセスしようとしましたが、プロセスの準備ができるまでゼロになりました。
次のApacheCommonsクラスを使用して、Javaのファイルシステム上のファイルを一覧表示しています。
Collection<File> allFiles = FileUtils.listFiles(rootDirectory, null, recursive);
これは非常に長いプロセスであり、最大5分かかる場合があります。
作成中にコレクションのサイズを確認する方法はありますか?
別のスレッドからアクセスしようとしましたが、プロセスの準備ができるまでゼロになりました。
メソッドから戻り値を取得するまでは、このメソッドが内部で使用する変数にアクセスできないため、データが取り込まれるコレクションにアクセスすることはできません。
再帰フラグを使用せずに検索を細かく分割し、自分で再帰を処理してディレクトリごとのコレクションを受け取ることができます。
Java 7 を使用している場合は、FileVisitor
インターフェイスを使用してファイル システムを探索することをお勧めします。進行状況を追跡できるコールバック メソッドがいくつかあります。
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 は進行状況を更新するメソッドです。
これを行う唯一の方法は (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));
}
});
リストコマンドの出力を一時ファイルにリダイレクトし、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