gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 20:03:52 25 4
gpt4 key购买 nike

我希望能够从数据库中读取文档并从中提取一些数据。我能够完成第二部分,但我无法高效完成。有没有一种更有效的方法来读取 BLOB 而无需先在本地写入它们?如您所见,我将数据保存到硬盘驱动器上的文档中,速度非常慢。

final String url = "connectioninfo";
final String username = "user";
final String password = "password";

try {
Connection conn = DriverManager.getConnection(url, username, password);

String sql = "SELECT document_id, file_name, data FROM documents WHERE file_name like '%.doc'";
PreparedStatement stmt = conn.prepareStatement(sql);
ResultSet resultSet = stmt.executeQuery();

while (resultSet.next()) {
String da_document_id = resultSet.getString(1);
String file_name = resultSet.getString(2);

File data = new File("c:\\databaseDoc.doc");
FileOutputStream fos = new FileOutputStream(data);

byte[] buffer = new byte[1];
InputStream is = resultSet.getBinaryStream(3);
try {
while (is.read(buffer) > 0) {
fos.write(buffer);
}
fos.close();
} catch (IOException e) {
e.printStackTrace();
}


System.out.println("da_document_id= " + da_document_id);
System.out.println("file_name= " + file_name);
}
conn.close();

} catch (SQLException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
}

最佳答案

它慢的部分原因是您一次读取一个字节。这绝不是一个好主意。如果您使用的是 Java 9,我还建议您使用 InputStream.transferTo(OutputStream) 让事情变得更简单:

但是不,您不需要写入 FileOutputStream - 您可以将数据复制到 ByteArrayOutputStream 中,此时您可以轻松创建一个 字节[]:

ByteArrayOutputStream output = new ByteArrayOutputStream();
try (InputStream input = resultSet.getBinaryStream(3)) {
input.transferTo(output);
}
byte[] data = output.toByteArray();

或者,如果您希望使用数据的方式已经接受InputStream,只需使用getBinaryStream 返回的流.不过,请确保您知道什么时候可以关闭流 - 有些用法可能会懒惰地阅读。

关于java - 有没有一种更有效的方法来读取 BLOB 而无需先在本地写入它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48461227/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com