com的线程回收不由java垃圾回收器进行处理,因此,每new一次jacob提供的类就要分配一定大小的内存给该操作,new出来的这个com对象在使用结束之后产生的垃圾java是无法回收的,new出来的对象越来越多,内存溢出就不可避免了,即使增加jvm内存也只是暂时的,迟早这些对象会把内存用完。既然java不能回收这些垃圾,那么com组件也应该提供了回收垃圾的方法,最后得知是ComThread.InitSTA()和ComThread.Release()方法,这两个方法其实就是初始化一个线程和结束这个线程,在创建com对象的时候初始化一个线程来运行这个对象,这个对象使用结束之后再结束线程,

/** * @fileName MSWordManager.java

* @description 该类用于查找word文档指定位置并将图片插入

* @date 2011-10-21 * @time * @author wst */

public class MSWordManager {

private Logger log = Logger.getLogger(MSWordManager.class);

// word文档

private Dispatch doc;

// word运行程序对象

private ActiveXComponent word;

// 所有word文档集合

private Dispatch documents;

// 选定的范围或插入点

private Dispatch selection;

public static int instanceSize=3;

//一个线程存放的MSWordManager数量

public MSWordManager(int index) {

if (word == null) {

word = new ActiveXComponent("Word.Application");

//为true表示word应用程序可见

word.setProperty("Visible", new Variant(false));

}

if (documents == null){

documents = word.getProperty("Documents").toDispatch();

}

if(index==0){

ComThread.InitSTA();

//初始化一个线程并放入内存中等待调用 } }

/** * 打开一个已经存在的文档 * @param docPath 要打开的文档

* @param key 文本框的内容,根据该key获取文本框当前位置

* @date 2011-12-9 * @author wst */

public void openDocumentAndGetSelection(String docPath, String key) {

try{

closeDocument() // 打开文档

doc = Dispatch.call(documents, "Open", docPath).toDispatch();

// shapes集合

Dispatch shapes = Dispatch.get(doc, "Shapes").toDispatch();

// shape的个数

String Count = Dispatch.get(shapes, "Count").toString();

for (int i = 1; i <= Integer.parseInt(Count); i++) {

// 取得一个shape

Dispatch shape = Dispatch.call(shapes, "Item", new Variant(i)).toDispatch();

// 从一个shape里面获取到文本框

Dispatch textframe = Dispatch.get(shape, "TextFrame").toDispatch();

boolean hasText = Dispatch.call(textframe, "HasText").toBoolean();

if (hasText) {

// 获取该文本框对象

Dispatch TextRange = Dispatch.get(textframe, "TextRange").toDispatch();

// 获取文本框中的字符串

String str = Dispatch.get(TextRange, "Text").toString();

//获取指定字符key所在的文本框的位置

if (str != null && !str.equals("") && str.indexOf(key) > -1) {

//当前文本框的位置

selection = Dispatch.get(textframe, "TextRange").toDispatch();

// 情况文本框内容

Dispatch.put(selection, "Text", ""); break; } }

} }catch(Exception e){ log.error(e); return; }

}

/** * 在当前位置插入图片

* @param imagePath 产生图片的路径

* @return 成功:true;失败:false */

public boolean insertImage(String imagePath) {

try{

Dispatch.call(Dispatch.get(selection, "InLineShapes").toDispatch(),"AddPicture", imagePath);

}catch(Exception e){

log.error(e); return false;

}

return true; }

//关闭文档 public void closeDocument()

{ if (doc != null) { Dispatch.call(doc, "Close"); doc = null; }

}

//关闭全部应用

public void close(int index) {

if (word != null) { Dispatch.call(word, "Quit"); word = null; }

selection = null; documents = null; if(index==instanceSize){

//释放占用的内存空间,因为com的线程回收不由java的垃圾回收器处理

ComThread.Release(); }

}

}

jacon的更多相关文章

随机推荐

  1. 【Java】需要注意的小细节

    一.==和equals 1.比较两个变量时 a.==可以判断两个变量是否相等,如果两个变量是基本类型变量,而且是数值类型,只要两个变量值相等,返回true. 2.比较两个引用变量 a.==只有两个引用 ...

  2. Python_Day8_面向对象编程进阶

    本节内容: 面向对象高级语法部分异常处理 经典类vs新式类 静态方法.类方法.属性方法 类的特殊方法 反射 Socket开发基础 经典类vs新式类 classical vs new style: 经典 ...

  3. git pull 然后 ahead of origin/master * commit 消失

    本来显示 your branch is ahead origin/master * commit后来也许在master merge 这个分支后, 然后git pull, 就显示Your branch ...

  4. Redis在JAVA中的运用(工具类)

    最近项目需要用redis在中间做缓存所以写了一个工具类作为练习用 redis版本:redis_version:3.0.504 用到阿里的解析JSON的库:fastjson import org.apa ...

  5. Android Studio安装和配置(个人研究,有错请指导)

    安装Android Studio的原因:公司有app开发者,然而公司没有测试,只好互相测试,本人并没有接触过app开发,纯小白: 自己试着安装了一下Android Studio来这里记录并分享遇到的问 ...

  6. 正则匹配中 ^ $ 和 \b 的区别

    正则匹配中 ^ $ 和 \b 的区别     ^和$分别代表字符串的开始和结束,因此^\d$只能匹配包含一个数字的字符串\b代表单词边界,其前后必须是不同类型的字符,可以组成单词的字符为一种类型,不可 ...

  7. Maplace.js – 小巧实用的 jQuery 谷歌地图插件

    Maplace.js是一个小的显示谷歌地图的 jQuery 插件,帮助你把谷歌地图嵌入到你的网站,快速在地图位置上创建标记和控制菜单.它需要 jQuery 和谷歌地图 API v3 支持,所以这两个都 ...

  8. diskpart查看硬盘序列号

    WIN + R键运行cmd,进如DOS界面: 1. systeminfo查看OS初始安装时间 2. diskpart工具查看硬盘序列号 (1)diskpart (2)lisk disk 查看主机安装的 ...

  9. Ubuntu搭建svn服务器

    一,安装必须的软件包. sudo apt-getinstall subversion 二,基本的SVN服务器配置        1,新建一个目录用于存储SVN所有文件                # ...

  10. C# 中的 Static

    今天测试了一下C#中 static 的初始化顺序: 1.调用时才初始化, 2.按照调用顺序初始化 3.先执行类的静态方法,然后初始化静态变量及方法 4.继承时,先执行子类的静态方法,然后执行父类的静态 ...