报表中呈现金蝶K3存放于数据库中经压缩过的大文本(续)

楼主
我是社区第91439位番薯,欢迎点我头像关注我哦~
原贴见 报表中呈现金蝶K3存放于数据库中经压缩过的大文本

      上次解决K3中经kdzip.dll压缩存储到数据库中的富文本内容产生了几个问题,一是kdzip.dll调用要使用32 位JDK,造成报表系统性能低下,经常报超出内存错误。二是kdzip解压要先生成待解压文件,然后通过对这个文件解压后重新生成一个文件,效率较差。
      经过向金蝶公司提单要求解决kdzip.dll64位文件问题,得到的答复是此文件是通过对zlib.lib静态库二次开发得来的,网上搜索了一大堆资料,发现JAVA原生的java.util.zip也是使用zlib压缩算法,接下来事情就变得简单多了,在原有代码上进行了修改。
  1. package com.fr.function;

  2. import java.io.ByteArrayInputStream;
  3. import java.io.IOException;
  4. import java.io.InputStream;
  5. import java.io.StringWriter;
  6. import java.io.UnsupportedEncodingException;
  7. import java.io.Writer;
  8. import java.util.Arrays;
  9. import java.util.zip.DataFormatException;
  10. import java.util.zip.Inflater;
  11. import com.fr.data.core.db.*;
  12. import com.fr.script.AbstractFunction;
  13. import com.fr.stable.ArrayUtils;
  14. import com.fr.stable.Primitive;
  15. import javax.swing.JEditorPane;
  16. import javax.swing.text.BadLocationException;
  17. import javax.swing.text.EditorKit;
  18. import org.jsoup.Jsoup;
  19. import org.jsoup.nodes.Document;
  20. import org.jsoup.nodes.Element;
  21. import org.jsoup.select.Elements;

  22. public class getK3ZipRTF extends AbstractFunction{
  23.         private static final long serialVersionUID = 1L;
  24.         @Override
  25.         public Object run(Object[] args) {
  26.                 // TODO Auto-generated method stub
  27.                 if(ArrayUtils.getLength(args)!=1) {
  28.                         return Primitive.ERROR_VALUE;
  29.                 }               
  30.                 return getK3Rtf2Html((BinaryObject)args[0]);
  31.         }
  32.         /***
  33.          *
  34.          * @param data 从数据库取得的IMAGE类型数据
  35.          * @return 解压后的字节数组
  36.          */
  37.         private static byte[] decompress(BinaryObject data) {
  38.                         byte[] bt=data.getBytes();
  39.                         Inflater decompresser=new Inflater(); //压缩对象
  40.                         decompresser.reset(); //清空对象数据
  41.                         decompresser.setInput(bt);//入入待解压二进制数
  42.                         int len=-1;
  43.                                 byte[] buf=new byte[1024];
  44.                                 try {
  45.                                         len=decompresser.inflate(buf); //解压后的数据写入字节数组,并获得数据长度
  46.                                 } catch (DataFormatException e) {
  47.                                         e.printStackTrace();
  48.                                 }
  49.                                 decompresser.end();                //结束解压
  50.                                 return Arrays.copyOf(buf,len);
  51.                 }
  52.         private static String getK3Rtf2Html(BinaryObject ins)
  53.                 {
  54.                         String insNew=null;
  55.                         byte[] b=decompress(ins); //解压后的字节数组
  56.                         InputStream is=new ByteArrayInputStream(b); //读入InputStream
  57.                         try {
  58.                                 insNew= rtfToHtml(is); //将输入流转为HTML
  59.                         } catch (IOException e) {
  60.                                 e.printStackTrace();
  61.                         }
  62.                         try {
  63.                                 insNew= new String(insNew.getBytes("Cp1252"), "GB2312"); //编码转换为GB2312
  64.                                 insNew=convertText(insNew);        //提取元素标签并进行转换                                
  65.                         } catch (UnsupportedEncodingException e) {
  66.                                 e.printStackTrace();
  67.                         }
  68.                         try {
  69.                                 is.close();
  70.                         } catch (IOException e) {
  71.                                 // TODO Auto-generated catch block
  72.                                 e.printStackTrace();
  73.                         }
  74.                         return insNew;               
  75.                 }
  76.         /***
  77.          *
  78.          * @param in输入流
  79.          * @return 输出String格式的HTML
  80.          * @throws IOException
  81.          */
  82.         private static String rtfToHtml(InputStream in) throws IOException {
  83.             JEditorPane p = new JEditorPane();
  84.             p.setContentType("text/rtf");
  85.            
  86.             EditorKit kitRtf = p.getEditorKitForContentType("text/rtf");
  87.             try {
  88.                     kitRtf.read(in, p.getDocument(), 0); //inputstream转成文档
  89.                 kitRtf = null;        
  90.                 EditorKit kitHtml = p.getEditorKitForContentType("text/html");                 
  91.                 Writer writer = new StringWriter();
  92.                 kitHtml.write(writer, p.getDocument(), 0, p.getDocument().getLength());
  93.                
  94.                 return writer.toString();
  95.             } catch (BadLocationException e) {
  96.                 e.printStackTrace();
  97.             }
  98.             return null;
  99.         }
  100.         /***
  101.          *
  102.          * @param HTML格式的字串
  103.          * @return 处理过的字串
  104.          */
  105.         private static String convertText(String text) {
  106.                 if(text!=null) {
  107.                         Document doc=Jsoup.parse(text);
  108.                         Elements links=doc.getElementsByTag("span");
  109.                         StringBuffer buffer=new StringBuffer();
  110.                                 for(Element link:links) {
  111.                                         buffer.append(link.text().trim()+"<br />");
  112.                                 }
  113.                                 return buffer.toString().trim();
  114.                 }
  115.                 return null;
  116.         }
  117. }

复制代码

通过代码的优化,从原来要 生成文件--解压文件--生成新的解压文件-读取文件的方式直接通过字节数组来操作,优化了性能。

目前,已将报表系统换成了64位,一天运行下来,没有因内存溢出出现任何问题,稳定性有了极大提升,较完美的解决了这一个问题,同理对于其它保存在数据库中的压缩图片等文件也可以通过此方法来解决。

编辑于 2018-10-6 16:18  
编辑于 2018-10-6 16:28  
分享扩散:

沙发
发表于 2018-10-6 19:06:27
板凳
发表于 2018-10-6 19:14:31
java啊,哎,
地板
发表于 2018-10-7 23:03:31
5楼
发表于 2018-10-8 10:46:11
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

4回帖数 1关注人数 7640浏览人数
最后回复于:2018-10-8 10:46

返回顶部 返回列表