java 用FlexPaper+SWFTools实现文章可看不可复制黏贴,转化swf,当文件名中含有多个空格,转化失败的原因及解决办法

本文详细介绍了在使用Java处理PDF文件转换为SWF格式时遇到的问题,即文件名中包含多个空格导致的转化失败。作者通过深入分析Runtime类的exec方法和其内部实现,发现问题是由于使用默认空格来分割字符串,导致文件名中的多个空格被简化为一个。为了解决这个问题,作者提出了一种新的解决方案,即使用ProcessBuilder类来构建命令行字符串,从而避免了空格处理的问题。最后,作者展示了成功转化PDF文件为SWF文件的完整代码,以及控制台输出的正确结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在项目中用FlexPaper+SWFTools实现仿百度文库的功能,其中需要将pdf转化为swf格式,这需要java来执行外部命令。以下是我截取pdf文件转swf文件的关键代码

	r = Runtime.getRuntime();
			Process p=null;
			try {
				 p = r.exec("d:/swftools/pdf2swf.exe "
						 +"\""+ pdfFile.getPath()+"\"" + " -o "
						 +"\""+swfFile.getPath()+"\""+ " -T 9");

上述代码中‘pdfFile.getPath()’是要转化的pdf源文件,前后加上双引号,可以解决文件名字存在空格的情况。例如执行命令:d:/swftools/pdf2swf.exe“d:/upload/file/改进金融监管  推动业务创新.pdf” –o “d:/upload/file/改进金融监管  推动业务创新.pdf”。-o 参数的作用是指明转化后swf文件的存放位置。

上述代码,对于源文件名中存在一个空格的有效,对于含有2个空格以上的文件名的文件的转化无效。通过Process类的getErrorStream(),打印错误输出流的信息,得知,程序报无法打开’xx xx.pdf’的错误,细心发现,文件名中的空格变成了一个空格,我源文件的名字原本是有2个空格的,为什么用Runtime.getRuntime().exec()会自动截取我的文件名,把空格变成一个?


现在可以将问题定位在Runtime类exec方法中了。通过查看API文档,无果。

通过导入源码包,查看源码,哈哈,发现代码最终调用的Runtime,exec的另一个重载方法。

问题就出现在StringTokenizer类这里了

    public Process exec(String command, String[] envp, File dir)
        throws IOException {
        if (command.length() == 0)
            throw new IllegalArgumentException("Empty command");

	StringTokenizer st = new StringTokenizer(command);
	String[] cmdarray = new String[st.countTokens()];
 	for (int i = 0; st.hasMoreTokens(); i++)
	    cmdarray[i] = st.nextToken();
	return exec(cmdarray, envp, dir);
    }

这里使用默认空格来分割字符串,这也是问题的根源所在了。因为使用空格分割,所以无论文件名中有多少个连续空格,最后都会变成一个空格,文件名变了,当然无法转化了。

现在知道不能使用Runtime这个类的exec方法来执行外部转化命令了。执行查看源代码,看到这里,忽然有种,山上水复疑无路,柳暗花明又一村的感觉。再一次,感慨,开源真好!



原来Runtime的exec方法最终也是用到ProcessBuilder类,看到这里,我果断打开Java API,查看ProcessBuilder类。

我想到,既然Runtime的exec方法最终也是将字符串(要执行的命令)分割成字符串数组,那么我自己来分割字符串,就不会受空格制约了。将命令分别add到一个list中,再调用

ProcessBuilder(List command)这个构造函数, Process p=newProcessBuilder(command).start();

//			r = Runtime.getRuntime();
			Process p=null;
			try {
//				 p = r.exec("d:/swftools/pdf2swf.exe "
//						 +"\""+ pdfFile.getPath()+"\"" + " -o "
//						 +"\""+swfFile.getPath()+"\""+ " -T 9");
				 List command=new ArrayList();
				 command.add("d:/swftools/pdf2swf.exe");
				 command.add("\""+ pdfFile.getPath()+"\"");
				 command.add("\""+swfFile.getPath()+"\"");
				 command.add("-T");
				 command.add("9");
				 p=new ProcessBuilder(command).start();

以下是控制台输出信息,

哈哈,至此,因为文件名中含有空格,造成转化失败问题得到圆满解决。





评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值