我有一个表格,我将我的pdf文件存储为blob。 我得到了InputStream并像这样插入它。
pstmt.setBinaryStream(1, inputStream);
为此,我创建了一个以Integer ID
和InputStream 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);
但我不明白为什么我的第一个版本不起作用,这两个版本之间的区别是什么。
答案 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的值(这是读入缓冲区的总字节数),所以你可能写的字节比你应该写的多,这可能是原因你文件的损坏。