午夜拍鍵驚奇
          子夜 編程 代碼與我同在
          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 ^ 閱讀(839) 評論(0)  編輯  收藏 所屬分類: Java 點滴
          主站蜘蛛池模板: 玉树县| 宜阳县| 松原市| 冷水江市| 富锦市| 军事| 齐齐哈尔市| 光泽县| 莆田市| 泌阳县| 大丰市| 麻阳| 察雅县| 丽水市| 呼图壁县| 夏邑县| 稷山县| 安顺市| 根河市| 平罗县| 拜泉县| 陆良县| 阿克| 彭泽县| 沈丘县| 清原| 红桥区| 万安县| 庆云县| 鹿泉市| 潞西市| 伊宁县| 伊春市| 棋牌| 邯郸县| 南充市| 汤阴县| 勃利县| 墨江| 会理县| 湖北省|