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<byte[]> responseEntity = new ResponseEntity<byte[]>
(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/pdfName
boolean 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();