深いフォルダ階層に配置されている非常に多くのファイルを繰り返し処理したいと思います。問題のファイルは、POIで処理する予定の15GBのMSWordドキュメントです。POIは正常に機能しますが、単純な再帰関数によってOutOfMemoryExceptionが発生します。
public void checkDir(File dir) {
for (File child : dir.listFiles()) {
if (".".equals(child.getName()) || "..".equals(child.getName()))
continue; // Ignore the self and parent aliases.
if (child.isFile())
processFile(child); // do something
else if (child.isDirectory())
checkDir(child);
}
}
// check if the word file can be read by POI
private void processFile(File file) {
InputStream in = null;
try {
in = new FileInputStream(file);
WordExtractor extractor = null;
try {
extractor = new WordExtractor(in);
extractor.getText();
} catch (Exception e) {
// This can happen if the file has the "doc" extension, but is
// not a Word document
throw new Exception(file + "is not a doc");
} finally {
in.close();
in = null;
}
} catch (Exception e) {
// log the error to a file
FileWriter fw = null;
try {
fw = new FileWriter("corruptFiles.txt", true);
fw.write(file.getAbsolutePath() + "\r\n");
} catch (Exception e2) {
e.printStackTrace();
} finally {
try {
fw.close();
} catch (IOException e3) {
}
}
}
これを達成しようとするorg.apache.commons.io.FileUtils.iterateFiles
と、同じ例外が発生します。
String[] extensions = { "doc" };
Iterator<File> iter = FileUtils.iterateFiles(dir, extensions, true);
for(; iter.hasNext();)
{
File file = iter.next();
processFile(file); // do something
}
Windows7でJava6を実行していますが、ファイルを移動または再配置することはできません。
私のオプションは何ですか?
お時間をいただきありがとうございます。
[編集]processFile関数を追加しました。ヒープサイズを512MBに増やした後、単純化されたバージョンのprocessFileで正常に実行されました。結論として、私の問題はどういうわけかPOIに関連しており、ファイルの反復に関連していません。
private void processFile(File file) {
System.out.println(file);
}
[EDIT2]例外の原因を33MBのファイルに絞り込むことができました。その結果を解析しようとすると、java.lang.OutOfMemoryError:Javaヒープスペース例外が発生します。POIバグトラッカーにチケットを投稿します。皆さんの提案に感謝します。反復の問題を克服するのに役立ったMathAsmLangの答えを受け入れます。クリシュナクマープのコメントを最初に指摘したので、答えとして受け入れたでしょうが、それは不可能であることがわかりました;-)