Java从数据库中获取Blob并写入

时间:2016-04-05 16:24:32

标签: java pdf

我有一个表格,我将我的pdf文件存储为blob。 我得到了InputStream并像这样插入它。

pstmt.setBinaryStream(1, inputStream);

为此,我创建了一个以Integer IDInputStream blob;为变量的模型。

我从我的数据库中读到了这样的blob。

blob.setBlob(rs.getBinaryStream("blob_file"));

现在我尝试再次创建PDF文件。

byte[] buffer = new byte[4096];
        File file= new File("c:\\MyPath\\myPDF.pdf");

        try{
            FileOutputStream output= new FileOutputStream(file);
            int b = 0;
            while ((b = blob.getBlob().read()) != -1) {
                output.write(buffer);

            }
            output.close();
        }catch(IOException ex){
            System.err.println("Blob Error: "  + ex.getMessage());
        }

使用这种方法,我得到了一个无法打开的损坏的PDF文件。

我找到了一个非常好的替代方案。

IOUtils.copy(blob.getBlob(), output);

但我不明白为什么我的第一个版本不起作用,这两个版本之间的区别是什么。

1 个答案:

答案 0 :(得分:1)

试试这个:

 FileOutputStream output = null;
 InputStream is = blob.getBlob();
 try{
    output= new FileOutputStream(file);
    int b = 0;
    while ((b = is.read(buffer)) != -1) {
        output.write(buffer, 0, b);
    }          
} catch(IOException ex){
    System.err.println("Blob Error: "  + ex.getMessage());
} finally {
   is.close();
   if (output != null) {
       output.close();
   }

}

初始代码中的问题是你不使用b的值(这是读入缓冲区的总字节数),所以你可能写的字节比你应该写的多,这可能是原因你文件的损坏。