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