午夜拍鍵驚奇
          子夜 編程 代碼與我同在
          posts - 48,comments - 118,trackbacks - 79

          Oracle中的lob (Large Object)可以存儲(chǔ)非常大的數(shù)據(jù)(可能是4GB),這樣就可以通過(guò)將文件或其它任何對(duì)象序列化成字節(jié)輸出流(OutputStream)后寫(xiě)入數(shù)據(jù)庫(kù),之后使用字節(jié)輸入流(InputStream)將數(shù)據(jù)讀出然后反序列化為原始文件或?qū)ο蟆2僮鲿r(shí)需要使用oracle的JDBC包,它擴(kuò)展了sun的JDBC包中的Blob對(duì)象。同時(shí)需要注意一些細(xì)節(jié)。下面的代碼演示如何使用blob(實(shí)例中需要Oracle的JDBC包)。

           1import oracle.jdbc.OracleResultSet;  // 使用Oracle的ResultSet對(duì)象
           2import oracle.sql.BLOB;  // 使用Oracle的BLOB對(duì)象,而不是sun的Blob
           3
           4
           5
           6try{
           7  Connection conn=<數(shù)據(jù)庫(kù)連接>;
           8  File file=<存入數(shù)據(jù)庫(kù)的文件對(duì)象>;
           9  conn.setAutoCommit(false);  // 取消Connection對(duì)象的auto commit屬性
          10  String file_name=file.getName();
          11
          12  // 數(shù)據(jù)庫(kù)中有一個(gè)item表,其中的file_name (varchar2)存儲(chǔ)文件名,file_blob (blob)存儲(chǔ)文件對(duì)象
          13  String sql="INSERT INTO item (file_name,file_blob) VALUES ('" + file_name + "',EMPTY_BLOB())";  // 使用“EMPTY_BLOB()“成生一個(gè)空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”得到表的寫(xiě)鎖
          18  ResultSet rs=stmt.executeQuery(sql);
          19  rs.next();
          20  BLOB blob=((OracleResultSet)rs).getBLOB("file_blob");  // 得到BLOB對(duì)象
          21  OutputStream out=blob.getBinaryOutputStream();  // 建立輸出流
          22  InputStream in=new FileInputStream(file);  // 建立輸入流
          23  int size=blob.getBufferSize();
          24  byte[] buffer=new byte[size];  // 建立緩沖區(qū)
          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

          如果要讀出文件的話只需調(diào)用BLOB的getBinaryStream()生成一個(gè)輸入流,再寫(xiě)入一個(gè)文件就行了。

          posted on 2005-02-13 22:27 ^ Mustang ^ 閱讀(845) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): Java 點(diǎn)滴
          主站蜘蛛池模板: 通州区| 敦化市| 汕头市| 克什克腾旗| 息烽县| 涟水县| 神农架林区| 镇巴县| 北票市| 望奎县| 宝鸡市| 汉沽区| 屯留县| 兴文县| 伊吾县| 东山县| 鲜城| 曲沃县| 都昌县| 内江市| 陆川县| 霍山县| 平定县| 开阳县| 称多县| 濮阳市| 苍南县| 邢台市| 安平县| 贺兰县| 沿河| 葵青区| 云霄县| 黔西| 九寨沟县| 皋兰县| 巴马| 河源市| 陇西县| 北辰区| 昔阳县|