Вы, кажется, находитесь на правильном пути в отношении получения двоичных данных из базы данных. Следующий код работает для меня с UCanAccess 3.0.0 под Java 7, где [Doc] является OLE Object
поля в Access таблице:
String sql = "SELECT Doc FROM OleTest WHERE ID=1";
try (Statement st = conn.createStatement();
ResultSet rs = st.executeQuery(sql)) {
rs.next();
InputStream inputStream = rs.getBinaryStream(1);
File f = new File("C:/Users/Gord/Desktop/thing.bin");
Files.copy(
inputStream,
f.toPath(),
java.nio.file.StandardCopyOption.REPLACE_EXISTING);
}
Теперь вопрос, содержит ли поле документа Word,
- в необработанном двоичном формате, или
- как истинный OLE («завернутый») объект.
Если поле содержало документ в двоичном формате, то мы могли бы просто переименовать файл в .docx и открыть его непосредственно в Word.
Однако в моем случае он был сохранен как «завернутый» OLE-объект, потому что я вложил документ в таблицу, используя «Вставить объект ...» в сам доступ. Поэтому .docx (Word) документ, который в сыром виде выглядит так ...
... извлекается из базы данных с "OLE обертку" вокруг него:
Если мы ищем вниз через данные OLE из базы данных мы можем увидеть начало необработанных двоичных данных, в этом случае при смещении 0xA57:
Итак, к сожалению, мы не можем просто сохранить двоичные данные OLE в файл, а затем открыть этот файл непосредственно в Word, потому что он не является допустимым файлом Word.
Удаление OLE «обертки» может быть сложным. Некоторые форматы файлов предназначены для игнорирования посторонних байтов в конце файла, поэтому такие подходы, как описанные в this answer (который просто удаляет «переднюю часть» OLE-оболочки), могут использоваться с форматами файлов изображений, такими как BMP, JPEG, и т. д. К сожалению, документы Word гораздо менее прощают «мусор» в конце файла, поэтому просто удаление «передней части» OLE-оболочки может по-прежнему приводить к файлу, который Word не может открыть.
Я вижу, поэтому я не смогу получить документ точно так, как это выглядит в слове, а не его двоичной форме с помощью getBinaryStream()? – whites
Не, если документ действительно был сохранен как объект OLE. Я обновил свой ответ, чтобы попытаться объяснить. –