午夜拍键惊奇
子夜 编程 代码与我同在
posts - 48,comments - 118,trackbacks - 79

Oracle中的lob (Large Object)可以存储非常大的数据(可能是4GB),这样就可以通过将文件或其它任何对象序列化成字节输出流(OutputStream)后写入数据库,之后使用字节输入流(InputStream)将数据读出然后反序列化为原始文件或对象。操作时需要使用oracle的JDBC包,它扩展了sun的JDBC包中的Blob对象。同时需要注意一些细节。下面的代码演示如何使用blob(实例中需要Oracle的JDBC包)。

 1import oracle.jdbc.OracleResultSet;  // 使用Oracle的ResultSet对象
 2import oracle.sql.BLOB;  // 使用Oracle的BLOB对象,而不是sun的Blob
 3
 4
 5
 6try{
 7  Connection conn=<数据库连接>;
 8  File file=<存入数据库的文件对象>;
 9  conn.setAutoCommit(false);  // 取消Connection对象的auto commit属性
10  String file_name=file.getName();
11
12  // 数据库中有一个item表,其中的file_name (varchar2)存储文件名,file_blob (blob)存储文件对象
13  String sql="INSERT INTO item (file_name,file_blob) VALUES ('" + file_name + "',EMPTY_BLOB())";  // 使用“EMPTY_BLOB()“成生一个空blob
14  Statement stmt=conn.createStatement();
15  int count=stmt.executeUpdate(sql);
16  
17  sql="SELECT file_blob FROM item WHERE iid='" + iid + "' FOR UPDATE";  // 使用“FOR UPDATE”得到表的写锁
18  ResultSet rs=stmt.executeQuery(sql);
19  rs.next();
20  BLOB blob=((OracleResultSet)rs).getBLOB("file_blob");  // 得到BLOB对象
21  OutputStream out=blob.getBinaryOutputStream();  // 建立输出流
22  InputStream in=new FileInputStream(file);  // 建立输入流
23  int size=blob.getBufferSize();
24  byte[] buffer=new byte[size];  // 建立缓冲区
25  int len;
26  while((len=in.read(buffer)) != -1)
27    out.write(buffer,0,len);
28  in.close();
29  out.close();
30
31  conn.commit();
32}

33catch(Exception ex){
34  try{
35    conn.rollback();
36  }

37  catch(SQLException sqle){
38    System.err.println(sqle.getMessage());
39  }

40}

41
42

如果要读出文件的话只需调用BLOB的getBinaryStream()生成一个输入流,再写入一个文件就行了。

posted on 2005-02-13 22:27 ^ Mustang ^ 阅读(819) 评论(0)  编辑  收藏 所属分类: Java 点滴

只有注册用户登录后才能发表评论。


网站导航: