有没有一种更有效的方法来读取BLOB而不先在本地写入它们?

时间:2018-01-26 12:18:14

标签: java database oracle blob

我希望能够从数据库中读取文档并从中提取一些数据。我可以做第二部分,但我有效地做到这一点有问题。有没有一种更有效的方法来读取BLOB而不先在本地写入它们?正如您所看到的,我将数据保存到硬盘驱动器上的文档中非常慢。

    _Yn (\r x -> if x==0 then 1 else x * r (x-1)) 5
    -- 120

3 个答案:

答案 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);
        }