我希望能够从数据库中读取文档并从中提取一些数据。我可以做第二部分,但我有效地做到这一点有问题。有没有一种更有效的方法来读取BLOB而不先在本地写入它们?正如您所看到的,我将数据保存到硬盘驱动器上的文档中非常慢。
_Yn (\r x -> if x==0 then 1 else x * r (x-1)) 5
-- 120
答案 0 :(得分:4)
它很慢的部分原因是你一次只读取一个字节。这绝不是个好主意。如果你使用的是Java 9,我还建议使用InputStream.transferTo(OutputStream)
使事情变得更简单:
但不,您不需要写入FileOutputStream
- 您可以将数据复制到ByteArrayOutputStream
,此时您可以轻松创建byte[]
:< / p>
ByteArrayOutputStream output = new ByteArrayOutputStream();
try (InputStream input = resultSet.getBinaryStream(3)) {
input.transferTo(output);
}
byte[] data = output.toByteArray();
或者,如果您希望使用数据的方式已经接受InputStream
,则只需使用getBinaryStream
返回的流。确保你知道什么时候可以关闭游戏 - 有些用法可能懒得读。
答案 1 :(得分:1)
您可以使用Apache POI直接读取BLOB输入流,而无需先将MS Word文档写入文件系统。
XWPFDocument document = new XWPFDocument(resultSet.getBinaryStream(3));
答案 2 :(得分:0)
我们的代码库使用Java NIO将blob写入文件。 api使用起来非常简单,并从代码中删除了读/写循环,并将该逻辑推送到Java核心apis中。
while (resultSet.next()) {
String da_document_id = resultSet.getString(1);
String file_name = resultSet.getString(2);
Path path = java.nio.file.FileSystems.getDefault().getPath("c:\\databaseDoc.doc");
InputStream is = resultSet.getBinaryStream(3);
java.nio.file.Files.copy(is, path);
System.out.println("da_document_id= " + da_document_id);
System.out.println("file_name= " + file_name);
}