建议用BLOD类型处理大型对象!

解决方案 »

  1.   

    二进制的数据并不是真正的存储在数据库中,在数据库中存储的只是一个路径,所以在读取这些数据的时候要,利用输入,输出流的方式来写入和读取它。
    下面的例子是写入一个二进制文件到oracle中并读取出它!
    BolbBean.java
    -----------------------------------------
    import java.sql.*;
    import javax.sql.*;
    import java.io.*;
    import oracle.jdbc.driver.OracleResultSet;
    import oracle.sql.BLOB;
    public class BlobBean
    {
       private Connection conn;
       /**
        *构造方法,创建Connection对象,并且在数据库中添加一个表。
        */
       public BlobBean()throws Exception
       {
           Class.forName("oracle.jdbc.driver.OracleDriver");
           conn =DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:oracle","scott",
     "tiger");//依据各人的情况来更改
           conn.createStatement().execute("create table blobtable(blobvalue blob)");
        }
        
        /**
         *写入Blob数据到数据库
         */
       public void addBlob(String fileName)throws Exception
       {
    conn.setAutoCommit(false);
           Statement stmt = conn.createStatement();
            stmt.execute("insert into blobtable values (empty_blob())");//注意写入二进制数据的方法
            ResultSet rset = stmt.executeQuery("SELECT blobvalue FROM blobtable FOR UPDATE");
            BLOB blob = null;
            while (rset.next()) {
                blob = ((OracleResultSet) rset).getBLOB(1);
                System.out.println(blob.length());
            }
            File binaryFile = new File(fileName);
            System.out.println(fileName+"'s length = " + binaryFile.length());
            FileInputStream instream = new FileInputStream(binaryFile);
            OutputStream outstream = blob.getBinaryOutputStream();
            int chunk = blob.getChunkSize();
            System.out.println("chunk size = " + chunk);
            byte[] buffer = new byte[chunk];
            int length = -1;
            while ((length = instream.read(buffer)) != -1)
               outstream.write(buffer, 0, length);
            instream.close();
            outstream.close();
            conn.commit();
        } 
        /**
         *从数据库读取blob数据,并且保存在文件系统。
         */
         public void readBlob(String fileName)throws Exception
         {
     conn.setAutoCommit(false);
             Statement stmt = conn.createStatement();
             ResultSet rset = stmt.executeQuery("SELECT blobvalue FROM blobtable");
             BLOB blob = null;
             while (rset.next()) {
                blob = ((OracleResultSet) rset).getBLOB(1);
                System.out.println(blob.length());
             }         FileOutputStream file_out = new FileOutputStream(new File(fileName));
             InputStream blob_in = blob.getBinaryStream();
             int temp;
             while((temp=blob_in.read())!=-1)
             file_out.write(temp);//读取数据、写入文件系统
               
             file_out.close();
             blob_in.close();
             conn.commit();
         }        
             
    }
    testblob.jsp
    ---------------------------------------
     <%@ page contentType="text/html; charset=gb2312" %>
    <jsp:useBean id="blobtest" class="BlobBean" scope="page"/>
    <%
    try{
        blobtest.addBlob("c:\\case.mdl");//写一个存在的文件路径
        blobtest.readBlob("c:\\case2.mdl");
        out.println("sucess!");
    }
    catch(Exception e){
       out.println(e);
       e.printStackTrace();
    }
    %>