Java - 在BLOB文件中保存数据

时间:2010-08-19 14:22:01

标签: java database jdbc binary-data

我想将大量二进制数据文件(pdf,图像,office文档...)保存到一个单独的“blob”文件中。现在我不确定什么是更好的,使用java Serializable保存内容并将内容保存到光盘或使用像sqlite这样的数据库来实现。还是有第三种,也许是更好的方式? 我的问题是,这些方法在访问速度和数据整合方面的表现如何。 在这一个单个blob文件中,将有一天可能有数百个pdf文件。 你更喜欢哪种方式?

3 个答案:

答案 0 :(得分:2)

绝对不要使用java.io.Serializable。只需按原样将二进制数据写入其目标。序列化只会增加不必要的开销,并且会使保存的数据无法用于除Java以外的其他工具。

我也不会在一行的单个字段中全部推送它。它使得它全部紧密耦合并且存储/检索各个条目可能更昂贵。而是将每个存储在自己的行中。如有必要,您可以使用外键将另一列链接/引用另一列。

现在是Java代码,JDBC API提供PreparedStatement#setBinaryStream()以将InputStream的二进制数据保存到数据库中。对于(内存占用)byte[]中的情况,还有setBytes()方法。然后,要检索它,您只需使用ResultSet#getBinaryStream()getBytes()

另一方面,您也可以使用FileOutputStream以常规Java IO方式将这些文件存储在本地磁盘文件系统中,并使用FileInputStream读取它们。您可以根据需要在数据库中存储文件路径/名称。这将二进制数据与数据库分离,这使得它不那么便携,但可以更好地重复用于其他目的。

另见

答案 1 :(得分:2)

假设您要创建一个大文件(而不是某种数据库条目),您可能希望使用java.util.zip包来创建这些PDF的ZIP文件,最好是未压缩的(因为它更快且PDF通常不能很好地压缩。)

通过这样做,您可以轻松地使用第三方工具从“blob文件”中提取这些PDF,即zip存档。

答案 2 :(得分:0)

这种从您的数据库中获取二进制文件或字节的方法

static void BackfileToDecktop(String s) {
   File outFile=new File("URL");//example (C:\\Users\\osama\\Desktop)

   search(4);//search the file in data base to fetch it
   try{
      FileOutputStream fos=new FileOutputStream(outFile);

      byte[]l=columnByte;//column of bytes come by search method get it from database by its primary key
      for(int i=0;i<l.length;i++) {
          fos.write(l[i]);
      }

      if(fos!=null) { 
          fos.close();//write all file bytes 
      }

      JOptionPane.showMessageDialog(null,"File was fetched successfully","Untitled pane",JOptionPane.INFORMATION_MESSAGE);
 } catch(java.io.IOException e){
      System.err.println(e);
 }

}