Oracle里读取Blob/Clob 乱码的解决办法

来源:互联网 发布:移动oa知乎 编辑:程序博客网 时间:2024/05/02 04:16
 
  1. package com.logcd.common;   
  2.   
  3. import java.io.BufferedReader;   
  4. import java.io.File;   
  5. import java.io.FileInputStream;   
  6. import java.io.InputStreamReader;   
  7. import java.io.Reader;   
  8. import java.io.Writer;   
  9. import java.net.HttpURLConnection;   
  10. import java.net.URL;   
  11. import java.sql.Connection;   
  12. import java.sql.DriverManager;   
  13. import java.sql.ResultSet;   
  14. import java.sql.SQLException;   
  15. import java.sql.Statement;   
  16.   
  17. import org.apache.commons.io.FileUtils;   
  18.   
  19. import oracle.sql.CLOB;   
  20.   
  21. public class OracleClob {   
  22.   
  23.     public static void main(String[] args) {   
  24.   
  25.         Integer id = saveClobDataUseSQL("测试", getFileContentAsString(   
  26.                 "D:/uploadDir/test.txt"true));   
  27.   
  28.         readClobDataUseSQL(id, new File("D:/uploadDir/test2.txt"));   
  29.     }   
  30.   
  31.     /**  
  32.      * 保存Clob数据  
  33.      *   
  34.      * @param name  
  35.      *            数据名称 
  36.      * @param data  
  37.      *            字串数据 
  38.      */  
  39.     @SuppressWarnings("deprecation")   
  40.     public static Integer saveClobDataUseSQL(String name, String data) {   
  41.         Connection conn = getConnection();   
  42.         Integer id = (int) (Math.random() * 100000);   
  43.   
  44.         StringBuilder sqlBuilder = new StringBuilder();   
  45.         try {   
  46.             conn.setAutoCommit(false);   
  47.             Statement stmt = conn.createStatement();   
  48.   
  49.             sqlBuilder.append("insert into TEST_CLOB(ID, NAME, CONTENT) ");   
  50.             sqlBuilder.append("values ( " + id);   
  51.             sqlBuilder.append(",'" + name + "'");   
  52.             sqlBuilder.append(", empty_clob()) ");// 插入一个空对象empty_clob()  
  53.   
  54.             stmt.executeUpdate(sqlBuilder.toString());   
  55.             // 锁定数据行进行更新,注意“for update”语句  
  56.             String sqlUpd = "select CONTENT from TEST_CLOB where ID = " + id   
  57.                     + " for update";   
  58.             ResultSet rs = stmt.executeQuery(sqlUpd);   
  59.             if (rs.next()) {   
  60.                 // 得到java.sql.Clob对象后强制转换为oracle.sql.CLOB  
  61.                 CLOB clob = (CLOB) rs.getClob("CONTENT");   
  62.                 Writer outStream = clob.setCharacterStream(0L);   
  63.                 // data是传入的字符串,定义:String data  
  64.                 char[] c = data.toCharArray();   
  65.                 outStream.write(c, 0, c.length);   
  66.   
  67.                 outStream.flush();   
  68.                 outStream.close();   
  69.   
  70.                 conn.commit();   
  71.                 stmt.close();   
  72.             }   
  73.   
  74.         } catch (Exception e) {   
  75.             try {   
  76.                 conn.rollback();   
  77.                 id = null;   
  78.             } catch (SQLException e1) {   
  79.                 e1.printStackTrace();   
  80.             }   
  81.             e.printStackTrace();   
  82.         } finally {   
  83.             try {   
  84.                 conn.close();   
  85.             } catch (SQLException e) {   
  86.                 e.printStackTrace();   
  87.             }   
  88.         }   
  89.         return id;   
  90.     }   
  91.   
  92.     /**  
  93.      * 读出数据并存成文件  
  94.      *   
  95.      * @param id  
  96.      * @param file  
  97.      */  
  98.     public static void readClobDataUseSQL(Integer id, File file) {   
  99.         Connection conn = getConnection();   
  100.         try {   
  101.             Statement st = conn.createStatement();   
  102.             String sql = "select CONTENT from TEST_CLOB where ID = " + id;   
  103.             ResultSet rs = st.executeQuery(sql);   
  104.   
  105.             if (rs.next()) {   
  106.   
  107.                 CLOB clob = (CLOB) rs.getClob("CONTENT");   
  108.   
  109.                 String result = convertClobToString(clob);   
  110.                 System.out.println(result);   
  111.                 FileUtils.writeStringToFile(file,result, "utf-8");   
  112.             }   
  113.         } catch (Exception e) {   
  114.             e.printStackTrace();   
  115.         } finally {   
  116.             try {   
  117.                 conn.close();   
  118.             } catch (SQLException e) {   
  119.                 e.printStackTrace();   
  120.             }   
  121.         }   
  122.   
  123.     }   
  124.   
  125.     /**  
  126.      * 将CLOB转换成字串  
  127.      * @param clob  
  128.      * @return  
  129.      */  
  130.     public static String convertClobToString(CLOB clob) {   
  131.         String reString = "";   
  132.         try {   
  133.             Reader is = clob.getCharacterStream();// 得到流  
  134.             BufferedReader br = new BufferedReader(is);   
  135.             String s = br.readLine();   
  136.             StringBuffer sb = new StringBuffer();   
  137.             while (s != null) {   
  138.                 sb.append(s);   
  139.                 sb.append("/n");   
  140.                 s = br.readLine();   
  141.             }   
  142.             reString = sb.toString().trim();   
  143.         } catch(Exception e) {   
  144.             e.printStackTrace();   
  145.         }   
  146.         return reString;   
  147.     }   
  148.   
  149.     /**  
  150.      * 取得数据库连接  
  151.      *   
  152.      * @return  
  153.      */  
  154.     public static Connection getConnection() {   
  155.         String driver = "oracle.jdbc.driver.OracleDriver";   
  156.         String url = "jdbc:oracle:thin:@195.2.199.5:1521:orcl";   
  157.         Connection conn = null;   
  158.         try {   
  159.             Class.forName(driver);   
  160.             conn = DriverManager.getConnection(url, "testdb""logcd");   
  161.         } catch (ClassNotFoundException e) {   
  162.             e.printStackTrace();   
  163.         } catch (SQLException ex) {   
  164.             ex.printStackTrace();   
  165.         }   
  166.         return conn;   
  167.     }   
  168.   
  169.     /**  
  170.      * 读取文件内容  
  171.      *   
  172.      * @param _url  
  173.      * @param isLocal 
  174.      * @return  
  175.      */  
  176.     public static String getFileContentAsString(String _url, boolean isLocal) {   
  177.         StringBuilder strb = new StringBuilder();   
  178.         try {   
  179.             InputStreamReader read = null;   
  180.             ;   
  181.             if (!isLocal) {   
  182.                 URL url = new URL(_url);   
  183.                 HttpURLConnection connection = (HttpURLConnection) url   
  184.                         .openConnection();   
  185.                 read = new InputStreamReader(connection.getInputStream());   
  186.             } else {   
  187.                 File file = new File(_url);   
  188.                 read = new InputStreamReader(new FileInputStream(file));   
  189.             }   
  190.             BufferedReader br = new BufferedReader(read);   
  191.   
  192.             char[] cbuf = new char[1024];   
  193.             while (br.read(cbuf) != -1) {   
  194.                 strb.append(cbuf);   
  195.             }   
  196.         } catch (Exception e) {   
  197.             e.printStackTrace();   
  198.         }   
  199.   
  200.         return strb.toString();   
  201.     }   
  202.   
  203. }  
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 九个月宝宝不喝牛奶怎么办 吃羊肉和西瓜后怎么办 娃儿感冒了很咳怎么办 5岁娃儿经常感冒发烧怎么办 娃儿冷得发抖感冒怎么办 吃羊肉和茶后怎么办 宝宝胆汁酸高22怎么办 5个月发烧38度怎么办 28个月宝宝不愿把尿怎么办 16个月宝宝咳嗽怎么办 宝宝晚上不用纸尿裤要尿床怎么办 宝宝头型睡偏了怎么办 初生婴儿鼻子被奶块堵住怎么办 月经排的不顺畅怎么办 四个月的小孩拉肚子怎么办 月经期做了水光怎么办 4个多月的宝宝拉肚子怎么办 2个月婴儿积食怎么办 3个月婴儿积食怎么办 2个月的婴儿干呕怎么办 脚上的皮烂了怎么办 嘴皮里面烂了怎么办 未满月婴儿拉屎很费劲怎么办 新生儿血钙1.7怎么办啊 3个月宝宝胃口小怎么办 3个月宝宝缺钙怎么办 五个月宝宝吃手睡觉怎么办 2个月宝宝有蛲虫怎么办 四个月婴儿漏屎怎么办 母乳喂养6个月才11斤怎么办 过期的果泥肉泥怎么办? 孩子被开水烫了怎么办 小儿喝开水烫了怎么办 小孩不识字怎么办17-18 3岁宝宝不识数字怎么办 小孩数字写反了怎么办 3岁宝宝乱啃东西怎么办 闹钟的指针松了怎么办 手机想让它横屏怎么办 教孩子写作业头都被气炸了怎么办 2岁宝宝大小脸怎么办