将InputStream放入BufferedOutputStream以上传到Blob中

时间:2013-10-29 19:02:34

标签: java oracle inputstream outputstream

我有一个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,所以我不知道正确的演员我应该使用。

2 个答案:

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

这会在从输入到输出的每个循环中复制一些字节数,直到输入用完为止。

缓冲区的大小是一个可调参数,你应该在你的环境中测试,看看哪种方法效果最好。