2016-04-05 16 views
0

私はBLOBとして私のPDFファイルを格納するテーブルがあります。 私はInputStreamを取得し、このように挿入します。このためJavaはデータベースからBLOBを取得し、書き込みます

pstmt.setBinaryStream(1, inputStream); 

私は、変数としてInteger IDInputStream blob;でモデルを作成しました。

私はこのようなBLOBを自分のDBから読みました。

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); 

しかし、なぜ私の最初のバージョンが動作しなかったのか、これらの2つの違いは何ですか?

答えて

1

この試してみてください:あなたの最初のコードに問題はあなたがおそらく(バッファに読み込まれたバイトの合計数である)bの値を使用するようにしていないという事実である

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(); 
    } 

} 

をファイルの破損の原因になっているはずのバイト数よりも多くのバイトを書き込みます。

+0

私はこれがバッファ 'byte [] buffer = new byte [4096];だと思います。それでもあなたのソリューションでは機能しません。バッファの正しい番号を取得するにはどうすればよいですか? – Ovoxo

+0

@Ovoxo良いキャッチ2番目のエラーis.read(バッファ)の代わりにis.read()でした。新しいコードで再試行してください –

+0

完璧な、すべてが機能しました!ありがとうございました! – Ovoxo

関連する問題