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