Читать файл OLE2 в Java без буферизации в памяти? - PullRequest
1 голос
/ 20 мая 2011

Я использую Apache POI для чтения файла OLE2 (может быть Word, может быть Excel). Используя POIFSFileSystem, я могу открыть файл и прочитать его содержимое. С этим все в порядке.

Однако, похоже, он использует довольно много памяти. Глядя на несколько битов POIFS, кажется, что различные биты файла буферизуются в памяти, иногда более одного раза.

Можно ли просто считать биты из файла, не загружая их сразу? Я заметил, что с новыми форматами файлов (ooxml) у вас есть выбор между File и InputStream, и в документах список конструкторов файлов указан как более низкий объем памяти. Есть ли что-то похожее для более старых OLE2 POIFS?

Я использую POI 3.7 Final, если это важно!

1 Ответ

1 голос
/ 20 мая 2011

Вам повезло, это можно сделать, но, увы, вам нужно перейти на бета-версию - код вышел после 3.7 Final. У вас должно быть все в порядке с 3,8 бета 2, но вы можете подождать 3,8 бета 3, если можете, так как код все еще работает.

Что вам нужно сделать, это переключиться с использования POIFSFileSystem на NPOIFSFileSystem. Префикс N предназначен для нового кода OLE2 на основе NIO, который более экономичен при использовании потока и намного более эффективен при использовании файла. См. NPOIFSFileSystem документы для получения более подробной информации.

Ваш код будет выглядеть примерно так:

// 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, ​​если вам нужно выполнить обратную запись (с более высоким объемом памяти)

...