0

我想遍历很多文件,这些文件放置在很深的文件夹层次结构中。有问题的文件是我打算用 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 的评论作为答案,因为他是第一个指出这一点的人,但事实证明这是不可能的 ;-)

4

1 回答 1

0

因为它是outofmemoryerror,你应该尝试用不同的内存参数(即堆大小)启动jvm。

于 2012-04-18T08:49:57.780 回答