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文件给删除掉

pdfjs ios不能预览_pdfjs ios不能预览

*****************************************************************************************

这里提供了一个更为直接的操作:将其放在 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();