我想遍历很多文件,这些文件放置在很深的文件夹层次结构中。有问题的文件是我打算用 POI 处理的 15 GB 的 MS Word 文档。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
}
我在 Windows 7 上运行 Java 6,并且不允许移动或重新排列文件。
我有哪些选择?
感谢您的时间。
[编辑] 添加了 processFile 函数。将堆大小增加到 512 MB 后,使用简化版本的 processFile 成功运行。总之,我的问题在某种程度上与 POI 相关,而不是迭代文件。
private void processFile(File file) {
System.out.println(file);
}
[EDIT2] 我可以将异常原因缩小到 33 MB 文件。尝试解析会导致 java.lang.OutOfMemoryError: Java heap space 异常。我将向 POI 错误跟踪器张贴一张票。谢谢大家的建议。我会接受 MathAsmLang 的回答,因为这有助于克服迭代问题。我会接受 krishnakumarp 的评论作为答案,因为他是第一个指出这一点的人,但事实证明这是不可能的 ;-)