我有一个InputStream,我知道这是一个PDF,我需要用它来更新Oracle中的Blob。如何将此流转换为BufferedOutputStream,或者使用此流信息更新Blob?
请注意,由于代码的限制,我 not 允许在我的代码中包装Oracle类。
到目前为止我尝试过:
我已经尝试使用这个答案:https://stackoverflow.com/a/1574857/2188082来连接流,但结果是NullPointerError,因为OutputStream是空的。
我正在尝试运行的当前查询:
pstmt = dbConn.prepareStatement("UPDATE "+ qualTable("document")+" set document_blob ="
+" utl_raw.cast_to_raw('"+inStream+"') where document_id = " + documentId);
pstmt.execute();
pstmt.close();
我知道utl_raw.cast_to_raw可能不是调用inStream读取的正确oracle方法,不幸的是我不像我想的那样精通Oracle,所以我不知道正确的演员我应该使用。
答案 0 :(得分:3)
PreparedStatement.setBlob(parameterIndex, inputStream, length).
像setString和其他setter一样。没有OutputStream,但需要一个长度。
答案 1 :(得分:1)
执行此操作的典型方法是创建byte[]
数组并使用它来传输数据:
byte[] buffer = new byte[4096]; // 4K buffer...
int len = 0;
while ((len = input.read(buffer)) >= 0) {
output.write(buffer, 0, len);
}
output.flush();
这会在从输入到输出的每个循环中复制一些字节数,直到输入用完为止。
缓冲区的大小是一个可调参数,你应该在你的环境中测试,看看哪种方法效果最好。