用Java读取OLE2文件而不缓冲到内存中?

时间:2011-05-19 21:53:54

标签: apache-poi

我正在使用Apache POI来读取OLE2文件(可能是Word,可能是Excel)。使用POIFSFileSystem,我可以打开文件,并阅读内容。那一点都很好。

然而,它似乎确实使用了相当多的内存。看几下POIFS,似乎文件的各个部分都被缓冲到内存中,有时不止一次。

是否可以只读取文件中的位,而不是一次性加载所有位?我注意到使用新的文件格式(ooxml),您可以在File和InputStream之间进行选择,并且文档将File构造函数列为较低的内存。旧的OLE2 POIFS有类似的东西吗?

我正在使用POI 3.7 Final以防万一!

1 个答案:

答案 0 :(得分:1)

你很幸运,它可以完成,但是你需要升级到beta版本 - 代码在3.7 Final之后进入。您应该可以使用3.8 beta 2,但是如果可以的话,您可能需要等待3.8 beta 3。

您需要做的是从使用POIFSFileSystem切换到NPOIFSFileSystem。 N前缀用于基于NIO的新OLE2代码,使用流时内存效率更高,使用文件时内存效率更高。有关详细信息,请参阅NPOIFSFileSystem docs

您的代码将类似于:

// This is the most memory efficient way to open the FileSystem
NPOIFSFileSystem fs;
try {
    fs = new NPOIFSFileSystem(new File(filename));
} catch (IOException e) {
    // an I/O error occurred, or the File did not provide a compatible
    // POIFS data structure
}
DirectoryEntry root = fs.getRoot();

在3.8 beta 2中,大多数POIDocument类(HSSFWorkbook等)将在其构造函数中接受DirectoryEntry,因此您可以从NPOIFSFileSystem中读取它们。但是,写支持还没有完成,所以如果你需要回写(内存占用更高),你需要坚持使用POIFSFileSytem