oracle中的lob (large object)可以存储非常大的数据(可能是4gb),这样就可以通过将文件或其它任何对象序列化成字节输出流(outputstream)后写入数据库,之后使用字节输入流(inputstream)将数据读出然后反序列化为原始文件或对象。操作时需要使用oracle的jdbc包,它扩展了sun的jdbc包中的blob对象。同时需要注意一些细节。下面的代码演示如何使用blob(实例中需要oracle的jdbc包)。
import oracle.jdbc.oracleresultset; // 使用oracle的resultset对象
import oracle.sql.blob; // 使用oracle的blob对象,而不是sun的blob
…
try{
connection conn=<数据库连接>;
file file=<存入数据库的文件对象>;
conn.setautocommit(false); // 取消connection对象的auto commit属性
string file_name=file.getname();
// 数据库中有一个item表,其中的file_name (varchar2)存储文件名,file_blob (blob)存储文件对象
string sql="insert into item (file_name,file_blob) values (" + file_name + ",empty_blob())"; // 使用“empty_blob()“成生一个空blob
statement stmt=conn.createstatement();
int count=stmt.executeupdate(sql);
sql="select file_blob from item where iid=" + iid + " for update"; // 使用“for update”得到表的写锁
resultset rs=stmt.executequery(sql);
rs.next();
blob blob=((oracleresultset)rs).getblob("file_blob"); // 得到blob对象
outputstream out=blob.getbinaryoutputstream(); // 建立输出流
inputstream in=new fileinputstream(file); // 建立输入流
int size=blob.getbuffersize();
byte[] buffer=new byte[size]; // 建立缓冲区
int len;
while((len=in.read(buffer)) != -1)
out.write(buffer,0,len);
in.close();
out.close();
conn.commit();
}
catch(exception ex){
try{
conn.rollback();
}
catch(sqlexception sqle){
system.err.println(sqle.getmessage());
}
}
如果要读出文件的话只需调用blob的getbinarystream()生成一个输入流,再写入一个文件就行了。
