无法直接删除预览pdf文件,故开启线程来进行删除pdf文件【文件预览带来的问题】
1.在进行实现office格式的文件转换为pdf文件进行预览的时候,当我们完成了对文件格式的转换后,会产生一个pdf文件,而后通过使用该pdf文件转换为字节数组返回给客户端进行预览即可,而这个时候问题便出现了,转换格式而产生的pdf文件直接就占用了内存,所以自然的便想着将其删除,不然若有多个用户来预览该文件,那么将产生多个pdf文件对内存的消耗无疑是大而且浪费的,当然也可以直接将每个文件产生的pdf文件保存不删除,然后下一次预览就不转换直接访问该pdf,但想着这是一种对内存的浪费,因为若有海量的文件,难道都保存一个相应的pdf文件吗?然后或许很久之后才有用户预览该文件,可以想象到若每个文件都被预览过一次,然后保存了一份pdf,然后就无人问津了,内存占用就直接乘了个至少2,实在过于浪费。所以还不如每次进行转换然后访问,之后删除文件ok结束。
2.而这个时候问题便出现了,当我执行完OpenOffice的convert函数之后得到了pdf文件,且也通过pdf文件得到了相应的字节数组,想着得到字节数组就直接把pdf文件给删除了,不过执行该pdf文件的delete方法却没能删除掉,通过debug没能找出问题所在,功力还是不到位,不过想要解决这个问题,自然也是有办法的。
3.为了能够及时且准确的删除掉用户预览所产生的pdf文件,故而直接开启线程来操作了。且看我的代码如下:
//就不给出这里的全部代码了,这里的功能就是将pdf文件的字节数组返回给客户端
//从我之前的文章中有关于这部分的说明,而加了try{}finally{}即是为了在return
//后还能执行开启线程的方法,当然其实线程方法也能放在return 之前,但我想了想还是放
//在finally里面来执行
try{ResponseEntity responseEntity = new ResponseEntity (pdfbyte,headers,HttpStatus.OK);//这里就已经将数据返回到了客户端,所以便可以果断进行删除产生的pdf文件//在这里调用线程来操作也行,不过我想使用finally来开启线程,即如下return responseEntity;
}
finally{//产生pdf文件名,传入文件名称给删除的方法,匹配上相应路径即可删除//文件的删除方法,在线程的run方法中进行了调用,后面有代码System.out.println("文件名称 : "+newFilePdfName);//果断开启线程RunnableUtil R1 = new RunnableUtil("删除pdf线程",newFilePdfName);R1.start();
}
其中的线程代码如下:
public class RunnableUtil implements Runnable{private Thread t;private String threadName; //线程名称private String newFilePdfName; //传来的pdf文件名称,即要删除的文件名称private boolean excute; public RunnableUtil(String name,String pdfname){threadName = name;newFilePdfName = pdfname;System.out.println("创建 " + threadName);System.out.println("传递文件名称:" + newFilePdfName);}public void run() {excute = true;while(excute){try { System.out.println("运行 : " + threadName);//调用删除文件的方法,参数为pdf文件名称boolean delok = OpenOfficeUtil.deletePdfFile(newFilePdfName);System.out.println("删除状态 delok : " + delok);if(delok) // 若 delok 为true则说明删除成功{System.out.println("删除成功:" + delok);excute = false; //停止循环操作System.out.println("删除成功停止线程!");}Thread.sleep(3000); } catch (InterruptedException e) {} }}public void start() {System.out.println("开始 " + threadName);if(t==null) //若线程为空则开启{t = new Thread(this,threadName);t.start();}}}
其中删除文件的代码如下:
/** 用于删除产生的pdf文件* 这里和RunnableUtil配合使用* 且应该在这里判断一下系统,以便配合linux系统的路径进行删除文件*/public static boolean deletePdfFile(String pdfName) {/** 这里先做个判断,当前项目所处的系统,因为windows和linux的文件路径有所区别*/String filePath = " ";String osName = System.getProperty("os.name");if(Pattern.matches("Linux.*",osName)){ System.out.println("当前处于Linux系统.");filePath = "/usr/local/TempOpenOffice/";}else if(Pattern.matches("Windows.*", osName)) {System.out.println("当前处于Windows系统.");filePath = "D:\\OpenOfficeTemp\\";}//匹配上相应的路径,得到如D:\\OpenOfficeTemp\\pdfName,或 /usr/local/TempOpenOffice/pdfNameboolean isokdel = false;File f = new File(filePath+pdfName);if(f.exists()){isokdel = f.delete();System.out.println("删除状态 isokdel : "+isokdel);}return isokdel;}
4.效果如下:可以从下图看到,其执行了2次删除操作,方才将pdf文件给删除掉

*****************************************************************************************
这里提供了一个更为直接的操作:将其放在 finally{} 里面即可
System.out.println("返回了数据,但是还是要执行这里" + newFilePdfName); final long timeInterval = 2000; //规定执行的间隔时间Runnable runnable = new Runnable() {boolean excute = true;public void run() {while(excute) {//在这里改为调用你的方法File f = new File("D:\\OpenOfficeTemp\\"+newFilePdfName);boolean isokdel = f.delete();if(isokdel){System.out.println("执行删除true :" + isokdel + " : name:" + newFilePdfName);excute = false; //当执行删除成功结束循环}try {Thread.sleep(timeInterval);} catch (InterruptedException e) {e.printStackTrace();}}}};Thread thread = new Thread(runnable);thread.start();
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
