午夜拍鍵驚奇
          子夜 編程 代碼與我同在
          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 點滴
          主站蜘蛛池模板: 蒲城县| 本溪| 新建县| 昭觉县| 容城县| 浦县| 中西区| 九江县| 平和县| 安徽省| 肇州县| 凤山市| 温宿县| 平罗县| 清镇市| 嘉祥县| 金寨县| 武安市| 九龙坡区| 龙井市| 清镇市| 托克逊县| 云霄县| 会同县| 长乐市| 湘潭市| 时尚| 景德镇市| 麟游县| 景洪市| 探索| 酉阳| 莫力| 南华县| 措勤县| 北碚区| 龙州县| 扶沟县| 石楼县| 吉隆县| 常宁市|