jacon
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的更多相关文章
随机推荐
- asp.net 获取汉字字符串的拼音首字母,含多音字
需求:在很多时候数据查询的时候,我们希望输入某个人姓名的拼音首字母进行查询,例如“潘长江”,输入“pcj”,就能搜索潘长江相关信息. 实现: #region 获取汉字转换拼音 首字母 public s ...
- Mac安装ctags
Mac安装ctags mac 系统有自带的ctags,但是不支持"ctags -R"指令,需要自己在安装Exuberant Ctags 1.下载ctags 2. 安装 ./conf ...
- 数据库 MySQL安装图解
MySQL安装图解 一.MYSQL的安装 1.打开下载的mysql安装文件,双击运行mysql-5.5.40-win32.msi. 2.选择安装类型,有"Typical(默认)". ...
- SQL优化有偿服务
本人目前经营MySQL数据库的SQL优化服务,100块钱一条.具体操作模式 其中第一条,可以通过在微信朋友圈转发链接中的信息(http://www.yougemysqldba.com/discuz/v ...
- 解决IE7和IE6不支持javaScript中的indexOf函数的问题
我这里是针对两个字符串的,如果是字符数组也差不多,代码如下: function indexCheck(str, sortStr) { str = String(str);// 将参数处理下,避免有数字 ...
- 通过a标签在页面上显示视频网站中的视频
1.把视频传到优酷.腾讯等视频网站中 <!DOCTYPE html> <html> <head lang="en"> <meta char ...
- biweb后台添加上传下载功能
1.数据库对应表添加字段 file varchar(100) 2.对应的后台 模块名/admin/addinfo.php里添加如下代码: //文件上传 if ((($_FILES[&quo ...
- css 分享之background-attachment 属性
微分享才发现的css背景图达到的效果代码属性: background-attachment -- 定义背景图片随滚动轴的移动方式: 值 描述 scroll 默认值.背景图像会随着页面其余部分的滚动而移 ...
- Android笔记——在布局文件中插入另一个布局文件
假如有一个布局文件A.xml想把另外一个布局文件B.xml引进其布局,则可以通过下面的代码 <include layout="@layout/B" />
- Mac Mysql初始密码重置
今天晚上mac更新后重装MySQL 安装完成后 启动服务,死活登录不了 提示1045错误.按照网上的资料对MySQL密码进行重置.记录步骤如下: 1.首先关闭MySQL服务 系统偏好设置->最下 ...