- 浏览: 994454 次
- 性别:
- 来自: 广州
文章分类
- 全部博客 (394)
- OSGI (14)
- 多线程 (10)
- 数据库 (30)
- J2ME (1)
- JAVA基础知识 (46)
- 引用包 (1)
- 设计模式 (7)
- 工作流 (2)
- Ubuntu (7)
- 搜索引擎 (6)
- QT (2)
- Ubuntu下编程 (1)
- 小程序 (2)
- UML (1)
- Servlet (10)
- spring (16)
- IM (12)
- 文档视频转为flash格式在线播放 (19)
- Maven (8)
- 远程调用 (2)
- PHPRPC (1)
- EXTJS学习 (2)
- Hibernate (16)
- 技术文章 (38)
- flex (5)
- 海量数据处理 (5)
- FTP (8)
- JS (10)
- Struts (1)
- hibernate search (13)
- JQuery (2)
- EMail (3)
- 算法 (4)
- SVN (7)
- JFreeChart (4)
- 面试 (4)
- 正规表达式 (2)
- 数据库性能优化 (10)
- JVM (6)
- Http Session Cookie (7)
- 网络 (12)
- Hadoop (2)
- 性能 (1)
最新评论
-
hy1235366:
能够随便也发一下,你退火算法程序使用的DistanceMatr ...
模拟退火算法总结(含例子)(转) -
梅强强:
感谢分享。。帮大忙了
swftools转换文件时线程堵塞问题的解决方法 -
wenlongsust:
openoffice和文件不在同一个服务器上,用过吗?
[JODConverter]word转pdf心得分享(转) -
2047699523:
如何在java Web项目中开发WebService接口htt ...
利用Java编写简单的WebService实例 -
abingpow:
唉,看起来好像很详细很不错的样子,可惜不是篇面向初学者的文章, ...
Spring与OSGi的整合(二)(转)
在使用swftools工具作转换时,最需要注意的是对转换过程中的输入流的处理和出错流的处理。不然,若对流入流(转换过程中会产生的输入流信息有类似如下:NOTICE processing PDF page 10 (595x842:0:0) (move:0:0)等等的打印时提示信息)处理,那么,转换不能进行下去,线程会堵塞,而不对出错流进行处理,那么当遇到有加密和损坏的文件转换时,也会导致线程的堵塞。对于输入流和出错流的处理,简单处理如下:
//注意destPath最后必须带文件分隔符 //这个用来转换的swfTool工具,一但待转换的文件有不可识别的字符在里面时,它就会堵塞在那里。这个情况要处理掉 public String PDF2SWF(String sourcePath, String destPath,String fileName) throws Exception { // 目标路径不存在则建立目标路径 File dest = new File(destPath); if (!dest.exists()) { dest.mkdirs(); } // 源文件不存在则返回 File source = new File(sourcePath); if (!source.exists()) { log.info("pdf转换swf失败,源文件不存在!"); throw new Exception(); } //因为下面进行系统调用,这样就会把系统执行的操作新开启一个线程(在此linux也叫进程),所以它和主扫描程序是独立运行,所以下次还会扫描这个转换中的文件,所以这里要将它设置为不可读, source.setReadable(false); FileConvertUtil fileConvertUtil = new FileConvertUtil(); fileName = fileConvertUtil.getFileName(fileName);//获取文件名 String outputFile = destPath + fileName + ".swf"; log.debug("开始调用swftools转换pdf文件:" + outputFile); List<String> command = new ArrayList<String>(); command.add(ProjectInit.swftoolsPath);//从配置文件里读取 command.add("-z"); // command.add("-B"); // command.add("rfxview.swf"); command.add("-s"); command.add("flashversion=9"); command.add("-s"); command.add("poly2bitmap");//加入poly2bitmap的目的是为了防止出现大文件或图形过多的文件转换时的出错,没有生成swf文件的异常 //windows平台下 // command.add("languagedir=C:/xpdf/chinese-simplified/"); command.add(sourcePath); command.add("-o"); command.add(outputFile); ProcessBuilder processBuilder = new ProcessBuilder(); processBuilder.command(command); Process process = processBuilder.start(); dealWith(process);//处理输入流和出错流 try { process.waitFor();//等待子进程的结束,子进程就是系统调用文件转换这个新进程 } catch (InterruptedException e) { e.printStackTrace(); } log.debug("转换完成!"); return outputFile; } private void dealWith(final Process pro){ // 下面是处理堵塞的情况 try { new Thread(){ public void run(){ BufferedReader br1 = new BufferedReader(new InputStreamReader(pro.getInputStream())); String text; try { while ( (text = br1.readLine()) != null) { System.out.println(text); } } catch (IOException e) { e.printStackTrace(); } } }.start(); } catch (Exception e) { e.printStackTrace(); } try { new Thread(){ public void run(){ BufferedReader br2 = new BufferedReader(new InputStreamReader(pro.getErrorStream()));//这定不要忘记处理出理时产生的信息,不然会堵塞不前的 String text; try { while( (text = br2.readLine()) != null){ System.err.println(text); } } catch (IOException e) { e.printStackTrace(); } } }.start(); } catch (Exception e) { e.printStackTrace(); } }
但是这里还是有问题的,因为这里调用process.start方法就开启一个线程进文件进行转换,而若还没开启转换,而线程切换,将文件转换的线程交这里对输入流的线程,那么由br1.readLine()读入的数据就是为null,所以这里的对输入流的处理也就起不了作用就会跳出while循环,而这时又将cpu的使用权交给swftools转换时,那么由于它的流入流和出错流没有线程来处理,所以它又会堵塞。因此使用下面的方式来做可以避免这个问题:
//注意destPath最后必须带文件分隔符 //这个用来转换的swfTool工具,一但待转换的文件有不可识别的字符在里面时,它就会堵塞在那里。这个情况要处理掉 public String PDF2SWF(String sourcePath, String destPath,String fileName) throws Exception { // 目标路径不存在则建立目标路径 File dest = new File(destPath); if (!dest.exists()) { dest.mkdirs(); } // 源文件不存在则返回 File source = new File(sourcePath); if (!source.exists()) { log.info("pdf转换swf失败,源文件不存在!"); throw new Exception(); } //因为下面进行系统调用,这样就会把系统执行的操作新开启一个线程(在此linux也叫进程),所以它和主扫描程序是独立运行,所以下次还会扫描这个转换中的文件,所以这里要将它设置为不可读, source.setReadable(false); FileConvertUtil fileConvertUtil = new FileConvertUtil(); fileName = fileConvertUtil.getFileName(fileName);//获取文件名 String outputFile = destPath + fileName + ".swf"; log.debug("开始调用swftools转换pdf文件:" + outputFile); List<String> command = new ArrayList<String>(); command.add(ProjectInit.swftoolsPath);//从配置文件里读取 command.add("-z"); // command.add("-B"); // command.add("rfxview.swf"); command.add("-s"); command.add("flashversion=9"); command.add("-s"); command.add("poly2bitmap");//加入poly2bitmap的目的是为了防止出现大文件或图形过多的文件转换时的出错,没有生成swf文件的异常 //windows平台下 // command.add("languagedir=C:/xpdf/chinese-simplified/"); command.add(sourcePath); command.add("-o"); command.add(outputFile); ProcessBuilder processBuilder = new ProcessBuilder(); processBuilder.command(command); Process process = processBuilder.start(); // dealWith(process);//改用下面的方式来处理: InputStreamWathThread inputWathThread = new InputStreamWathThread(process); inputWathThread.start(); ErrorInputStreamWathThread errorInputWathThread = new ErrorInputStreamWathThread(process); errorInputWathThread.start(); try { process.waitFor();//等待子进程的结束,子进程就是系统调用文件转换这个新进程 inputWathThread.setOver(true);//转换完,停止流的处理 errorInputWathThread.setOver(true); } catch (InterruptedException e) { e.printStackTrace(); } log.debug("转换完成"); return outputFile; }
这里将流入流和出错流作为一个监视线程,两个条件作为跳出循环的判断:
1 输入流处理类:
import java.io.BufferedReader; import java.io.InputStreamReader; import org.apache.log4j.Logger; //这个类主要用来处理一个系统调用而新创建一个线程或进程执行期间所产生的输入流的处理 public class InputStreamWathThread extends Thread { private Process process = null; private boolean over = false; private Logger logger = Logger.getLogger(getClass()); public InputStreamWathThread(Process p) { process = p; over = false; } public void run() { try { if (process == null) { logger.info("process为null,无法处理文件转换"); return; } //对输入流,可能是一个回车之类的输入 BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream())); while (true) { if (process == null || over) { logger.info("处理完成"); break; } String temp; while ((temp = br.readLine()) != null) { // logger.info("输入流信息:" + temp);//如这些信息:NOTICE processing PDF page 10 (595x842:0:0) (move:0:0)等等的打印时提示信息 ; } } } catch (Exception e) { e.printStackTrace(); logger.info("发生异常" + e.getMessage()); } } public void setOver(boolean over) { this.over = over; } }
2 出错流处理类:
import java.io.BufferedReader; import java.io.InputStreamReader; import org.apache.log4j.Logger; //这个类主要用来处理一个系统调用而新创建一个线程或进程执行期间所产生的出错流的处理 public class ErrorInputStreamWathThread extends Thread { private Process process = null; private boolean over = false; private Logger logger = Logger.getLogger(getClass()); public ErrorInputStreamWathThread(Process p) { process = p; over = false; } public void run() { try { if (process == null) { logger.info("process为null,无法处理文件转换"); return; } //对出错流的处理 BufferedReader br = new BufferedReader(new InputStreamReader(process.getErrorStream())); while (true) { if (process == null || over) { logger.info("处理完成"); break; } String temp; while ((temp = br.readLine()) != null) { // logger.info("出错流信息:" + temp); ; } } } catch (Exception e) { e.printStackTrace(); logger.info("发生异常" + e.getMessage()); } } public void setOver(boolean over) { this.over = over; } }
这样就可以使用process的执行完毕后通知输入流类和出错流处理类,这样就可以很好的处理调用swftools转换文件而引起的线程堵塞问题。
评论
3 楼
梅强强
2016-06-20
感谢分享。。帮大忙了
2 楼
songjiesdnu
2013-04-15
楼主你好!非常感谢你的分享~
有一个问题不明白,为什么将对输入流和出错流换成两个类之后就能避免线程切换导致的阻塞问题?
有一个问题不明白,为什么将对输入流和出错流换成两个类之后就能避免线程切换导致的阻塞问题?
1 楼
hsiunien
2012-08-19
谢谢 这篇文章对我用处很大,多亏谷歌的智能搜索。。百度太垃圾了。。
发表评论
-
SWFTOOLS PDF2SWF 参数详解(转)
2012-01-08 16:35 2281SWFTools提供了一系列将各种文件转成swf的工具: ... -
swftools安装
2010-12-06 20:35 1950安装swftools工具时,在windows平台下是很简单的事 ... -
pdf2swf fails to transform with the default options when the pdf are too large,
2010-11-25 14:10 4796if the pdf contains too many im ... -
[JODConverter]word转pdf心得分享(转)
2010-11-22 10:12 37613官方网站: http://www.artofsolving. ... -
flash 安全沙箱冲突
2010-10-28 20:46 7049下载flexpaper源码修改后做成swf阅读器,要加入待阅读 ... -
LInux下如何安装ffmpeg(转)
2010-10-11 13:55 1918终于装上了,把过程记录一下 首先要安装各种解码器 ... -
Flex Paper 源码编译
2010-10-02 09:05 8646FlexPaper是一个开源轻量级的在浏览器上显示各种文档的组 ... -
判定文件编码(文本流编码)的方法(转)
2010-09-25 12:53 1673在程序中,文本文件经常用来存储标准的ASCII码文本,比如英文 ... -
java使用jchardet检测文本文件(字节流)的编码方式(转)
2010-09-25 12:41 2245有时需要InputStreamReader(InputStre ... -
jodconverter纯文本文件转为pdf时中文问题解决方案
2010-09-25 12:31 4926jodconverter转换ms文件都 ... -
swftools使用注意
2010-09-15 10:00 2221swftools处理堵塞问题,请看文章:Process的wai ... -
mencoder环境搭建
2010-09-06 17:33 15161 到http://www.mplayerhq.hu/desi ... -
Mencoder常用视频转换参数(转)
2010-09-06 17:14 2864参数详解:1、-ofps 15 :帧速率15fps ... -
Mencoder常用视频转换参数(转)
2010-09-06 17:13 2109参数详解: 1、-ofps 15 ... -
利用ffmpeg+mencoder视频转换的总结(转)
2010-09-06 17:00 2744Youtube的成功,使得 ... -
ffmpeg+mencoder环境搭建和视频处理总结(转)
2010-09-06 16:54 4291ffmpeg+mencoder几乎可以完成目前基于web的播客 ... -
Mencoder转换flv参数详解(转)
2010-09-06 16:24 2555Mencoder简介: Mencoder是Mpl ... -
FLV视频转换的利器 - ffmpeg.exe和mencoder(转)
2010-09-06 15:07 6285文章1: 大家应该都知道Youtobe、Google ...
相关推荐
xpdf用来处理swftools将转换pdf中文问题
将其他格式字体转换成swf格式.适用于prezi等软件
可以把pdf、txt、word、ppt文件转换为swf格式的文件,
包含swftoolswindows版linux版 openOffice+swftools实现office文件转换成swf
SWFTools是一种实用工具与Adobe Flash文件(SWF文件)工作的集合。 该工具集包括用于阅读的SWF文件,结合他们,和他们建立从其他内容(如图像,声音文件,视频或源代码)程序。 SWFTools是在GPL下发布的。 SWFTools ...
将文档转换为swf文件,可在线阅读,类是百度文库!
swftools
SWFTools 是一组用来处理 Flash 的 swf 文件的工具包,包括: 1 合并工具 swfcombine 2. 抽取工具 swfextract 3. PDF/JPEG/PNG/AVI/TTF/WAV 到 SWF 的转换工具 :pdf2swf, jpeg2swf, png2swf, avi2swf, font2swf,...
swftools、flexpaper等工具包。swftools用于将pdf转换为swf文件,而flexpaper则可以实现对swf文件的播放,从而实现pdf文件的预览。
SWFTools是一种实用工具与Adobe Flash文件(SWF文件)工作的集合。 该工具集包括用于阅读的SWF文件,结合他们,和他们建立从其他内容(如图像,声音文件,视频或源代码)程序。 SWFTools是在GPL下发布的。 SWFTools ...
swftools pdf文件转换swf 很实用
使用SWFTools工具完成对pdf格式转换为swf格式的文件
linux swftools最新版 将pdf转换为swf的工具包
swftools包swftools包
swftools PDF等文档转换SWF工具安装版
由于公司项目需要实现类似百度文库在线查看文档的功能,所以自己写了一个小工具,定时读取数据库,将需要转换的文档转换为pdf,再按页转换为swf,并生成第一页的缩略图,在页面使用jquery media插件显示swf,以下是...
swftools 最新版本 可以说是源码
swftools安装好的压缩包
swftools-2011-01-23-1815.exe是一个很好用的工具,轻而易举将pdf转换成为swf文件格式,方便快捷,支持pdf单页和多页转换