轉載至程式先鋒技術維客[url]www.javabiz.cn[/url] 先來看看兩種LOB類型的主要區別: CLOB 表示Character LOB (字符LOB) 它能夠存儲大量的字符數據。 BLOB表示 Binary LOB(二進制LOB)。此數據類型的列能夠存儲大型二進制對象,如圖形、視頻剪輯和聲音文件等。 基本上咱們能夠得出這樣的結論: 文本文件咱們既可使用BLOB也可使用CLOB,二進制文件的存儲咱們只能使用BLOB類型. 好,下面經過代碼示例描述如何讀取和寫入LOB類型的字段: 1. 先建一張表,具備三個字段: CREATE TABLE "ATTACHMENT" ( "ID" VARCHAR2(10) NOT NULL, "MYCLOB" CLOB, "MYBLOB" BLOB, PRIMARY KEY("ID")); 2. 準備兩個文件用來存入數據庫: c:/Test.java 用來表明文本文件 C:/xx.jar 用來表明二進制數據 3. 存儲文本信息到CLOB字段中 Connection conn = DBUtil.getConnection(); conn.setAutoCommit(false); Statement stmt = conn.createStatement(); //先初始化CLOB字段,此處爲必須的操做,不然後面會產生空指針異常 String initSql = "UPDATE ATTACHMENT SET MYCLOB=EMPTY_CLOB() WHERE ID=1"; //讀取CLOB字段 String updateSql = "SELECT MYCLOB FROM ATTACHMENT WHERE ID=1"; stmt.executeUpdate(initSql); ResultSet rs = stmt.executeQuery(updateSql); if (rs.next()) { CLOB clob = (CLOB) rs.getClob(1); //獲取CLOB字段內容並轉換爲 oracle.sql.CLOB類型 //獲取CLOB的輸出流 Writer os = clob.getCharacterOutputStream(); //讀取文本文件 BufferedReader br = new BufferedReader(new FileReader(new File( "c:/Test.java"))); String line = br.readLine(); StringBuffer buffer = new StringBuffer(); while (line != null) { buffer.append(line); line = br.readLine(); } os.write(buffer.toString()); os.flush(); br.close(); os.close(); conn.commit(); conn.close(); } System.out.println("Saved"); 在SQLPlus中測試一下文件有沒有存入到數據庫中, SQL> SQL> SELECT DBMS_LOB.GETLENGTH(MYCLOB) FROM ATTACHMENT; 顯示結果以下: DBMS_LOB.GETLENGTH(MYCLOB) -------------------------- 177 這代表文件已經寫入到這個MYCLOB字段中,若是沒有存入的話,SQLPlus中不會顯示任何數字(包括零也不會被顯示), 如今能夠進行下一步操做了 4. 讀取CLOB字段中的文本信息 Connection conn = DBUtil.getConnection(); Statement st = conn.createStatement(); PreparedStatement preparedStatement = conn.prepareStatement("SELECT MYCLOB FROM ATTACHMENT WHERE ID=1"); ResultSet rs = preparedStatement.executeQuery(); if (rs.next()) { //獲取CLOB字段信息 CLOB clob = (CLOB)rs.getClob("MYCLOB"); BufferedReader br = new BufferedReader(clob.getCharacterStream()); //建立輸出流 BufferedWriter out = new BufferedWriter(new FileWriter("C:/tttt.txt")); String line = br.readLine(); while (line != null) { out.write(line); System.out.println(line); line = br.readLine(); out.flush(); } out.close(); br.close(); } rs.close(); st.close(); conn.close(); 5. 寫入二進制信息到BLOB字段 conn = DBUtil.getConnection(); // 設置不自動提交 conn.setAutoCommit(false); // 建立數據庫操做語句 statement = conn.createStatement(); // 定義SQL語句 statement.executeUpdate("UPDATE ATTACHMENT SET MYBLOB = EMPTY_BLOB() WHERE ID=1"); String strSQL = "SELECT MYBLOB FROM ATTACHMENT WHERE ROWNUM = 1 FOR UPDATE"; resultset = statement.executeQuery(strSQL); BLOB contents = null; while (resultset.next()) { // 取出BLOB對象 contents = (oracle.sql.BLOB) resultset.getBlob(1); } OutputStream out = contents.getBinaryOutputStream(); FileInputStream in = new FileInputStream(new File("c:/XX.jar")); //將輸出流和輸入流對轉 FileUtil.copy(in, out); out.close(); in.close(); // 數據庫提交 conn.commit(); conn.close(); 一樣,這裏咱們也在SQLPlus中測試一下BLOB字段中是否已經含有數據: SQL> SQL> SELECT DBMS_LOB.GETLENGTH(MYBLOB) FROM ATTACHMENT; 顯示結果以下: DBMS_LOB.GETLENGTH(MYBLOB) -------------------------- 211 代表已經存入數據,數據的大小是21.1k, 如今能夠進行讀取操做了 6. 讀取BLOB字段中內容並存儲到一個文件中 Connection conn = DBUtil.getConnection(); conn.setAutoCommit(false); PreparedStatement preparedStatement = conn .prepareStatement("SELECT DATA FROM ATTACH WHERE ROWNUM=1"); ResultSet rs = preparedStatement.executeQuery(); if (rs.next()) { Blob blob = rs.getBlob(1); if (blob != null) { InputStream is = ((BLOB) blob).getBinaryStream(); // ((CLOB) clob).getCharaterStream(); FileOutputStream fos = new FileOutputStream(new File( "c:/abc.jar")); FileUtil.copy(is, fos); fos.close(); is.close(); } } rs.close(); preparedStatement.close(); conn.close(); 輸出: c盤的根目錄下應該出現了一個abc.jar 的文件, 你能夠根據字節數和xx.jar比較一下,應該徹底相同. 上述步驟是使用了示例代碼展現瞭如何操做Oracle中LOB字段類型,若是須要本文中的所有源代碼請發送郵件到[email]info@javabiz.cn[/email]