亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

java基于servlet實(shí)現(xiàn)文件上傳功能解析

 更新時(shí)間:2016年05月23日 14:53:51   作者:fonely__  
這篇文章主要為大家詳細(xì)介紹了java基于servlet實(shí)現(xiàn)上傳功能,后臺(tái)使用java實(shí)現(xiàn),前端主要是js的ajax實(shí)現(xiàn),感興趣的小伙伴們可以參考一下

最近項(xiàng)目需要做一個(gè)文件上傳功能,做完了分享下,順帶當(dāng)做筆記。
上傳功能用后臺(tái)用java實(shí)現(xiàn),前端主要是js的ajax實(shí)現(xiàn)。后臺(tái)還加入定時(shí)刪除臨時(shí)文件。
效果如圖

這里寫(xiě)圖片描述

這里寫(xiě)圖片描述

首先是上傳功能的主要類(lèi),下面是代碼

package util.upload;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.UUID;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

public class UploadServlet extends HttpServlet {

 private static final long serialVersionUID = -3100028422371321159L;
 private boolean isAllowed;
 private String upFileName;
  //定義合法后綴名的數(shù)組
 private String[] allowedExtName=new String[]
      {"zip","rar",//壓縮文件
     "txt","doc","wps","docx","java",//文本
     "xls","xlsx",//表格
     "ppt","pptx",//幻燈片
     "pdf",//pdf
     "jpg","jpeg","bmp","gif","png"http://圖片
     };
 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 doPost(request, response);

 }

 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 //設(shè)置編碼格式為utf-8
 request.setCharacterEncoding("utf-8");
 response.setCharacterEncoding("utf-8"); 
 //獲取session,保存進(jìn)度和上傳結(jié)果,上傳開(kāi)始為nok,當(dāng)為Ok表示上傳完成
 HttpSession session=request.getSession();
 session.setAttribute("result", "nok");
 session.setAttribute("error", "");
 String error="";
 upFileName="";
 isAllowed=false;
 //給上傳的文件設(shè)一個(gè)最大值,這里是不得超過(guò)100MB
 int maxSize=100*1024*1024;
 //創(chuàng)建工廠對(duì)象和文件上傳對(duì)象
 DiskFileItemFactory factory=new DiskFileItemFactory();
 ServletFileUpload upload=new ServletFileUpload(factory);
 //創(chuàng)建上傳監(jiān)聽(tīng)器和設(shè)置監(jiān)聽(tīng)器
 UploadListener listener=new UploadListener();
 session.setAttribute("LISTENER", listener);
 upload.setProgressListener(listener); 
 //上傳路徑
 String path = request.getSession().getServletContext().getRealPath("/upload");
 String requestPath = request.getSession().getServletContext().getContextPath()+"/upload";
 File dirFile =new File(path);   //System.out.println(request.getSession().getServletContext().getContextPath());
 //如果文件夾不存在則創(chuàng)建  
 if (!dirFile .exists() && !dirFile .isDirectory())   
 {     
  dirFile .mkdir();  
 }  
 //根據(jù)日期創(chuàng)建文件夾,保存到對(duì)應(yīng)日期的文件夾下
 Date date=new Date();
 SimpleDateFormat sdf=new SimpleDateFormat("yyyyMMdd");
 String subDirName=sdf.format(date);
 File subDirFile=new File(path+"/"+subDirName);
 if (!subDirFile .exists() && !subDirFile .isDirectory())   
 {    
   subDirFile .mkdir();  
 }  
 try { 
  //解析上傳請(qǐng)求
  List<FileItem> items=upload.parseRequest(request);  
  Iterator<FileItem> itr=items.iterator();  
  while(itr.hasNext()){   
  FileItem item=(FileItem)itr.next();
  //判斷是否為文件域  
  if(!item.isFormField()){   if(item.getName()!=null&&!item.getName().equals("")){
   //獲取上傳文件大小和文件名稱
   long upFileSize=item.getSize();  
   String fileName=item.getName();

   //獲取文件后綴名
   String[] splitName=fileName.split("\\.");
   String extName=splitName[splitName.length-1];
   //檢查文件后綴名
   for(String allowed:allowedExtName)
   {
    if(allowed.equalsIgnoreCase(extName))
    {
      isAllowed=true;
    }    
   }
   if(!isAllowed){
     error="上傳文件格式不合法!";
     break;
   }
   if(upFileSize>maxSize){
    error="您上傳的文件太大了,請(qǐng)選擇不超過(guò)100MB的文件!";
    break;
   } 
   //此時(shí)文件暫存在服務(wù)器的內(nèi)存中,構(gòu)造臨時(shí)對(duì)象
   File tempFile=new File(makeFileName(fileName));

   //指定文件上傳服務(wù)器的目錄及文件名稱
   File file=new File(path+"/"+subDirName+"/",tempFile.getName());

   item.write(file);//第一種寫(xiě)文件方法
   upFileName=requestPath+"/"+subDirName+"/"+tempFile.getName();
 if(upFileName.equals("")){
   error="沒(méi)選擇上傳文件!";
 }
 System.out.println(upFileName);
   /*//構(gòu)造輸入流讀文件 第二種寫(xiě)文件方法
   InputStream is=item.getInputStream();
   int length=0;
   byte[] by=new byte[1024];

   FileOutputStream fos=new FileOutputStream(file);

   while((length=is.read(by))!=-1){
    fos.write(by, 0, length);
    //Thread.sleep(10);
   }
   fos.close();
   //Thread.sleep(1000);*/
   }else{
   error="沒(méi)選擇上傳文件!";
   }
  }
  }  
 } catch (Exception e) {
  e.printStackTrace();
  error="上傳文件出現(xiàn)錯(cuò)誤:"+e.getMessage();
 }
 if(!error.equals("")){ 
   System.out.println(error);
  session.setAttribute("error", error);
 }else{ 

  session.setAttribute("result", "OK"); 
  session.setAttribute("filename",upFileName);
 }
 }
 /**
 * 為防止文件覆蓋的現(xiàn)象發(fā)生,要為上傳文件產(chǎn)生一個(gè)唯一的文件名
 * @param filename 原文件名
 * @return 生成的唯一文件名
 */
 private String makeFileName(String filename){

   return UUID.randomUUID().toString() + "_" + filename;
  } 
}

其中需要引入commons-fileupload-1.3.1.jar,commons-io-2.4.jar
上傳過(guò)程中,我們需要實(shí)時(shí)獲取上傳進(jìn)度等信息,引入的庫(kù)里為我們添加了一個(gè)ProgressListener接口,我們?cè)賹?xiě)一個(gè)類(lèi)實(shí)現(xiàn)這個(gè)接口,上面類(lèi)中添加該接口

//創(chuàng)建工廠對(duì)象和文件上傳對(duì)象
 DiskFileItemFactory factory=new DiskFileItemFactory();
 ServletFileUpload upload=new ServletFileUpload(factory);
 //創(chuàng)建上傳監(jiān)聽(tīng)器和設(shè)置監(jiān)聽(tīng)器
 UploadListener listener=new UploadListener();
 session.setAttribute("LISTENER", listener);
 upload.setProgressListener(listener);

下面是這個(gè)監(jiān)聽(tīng)類(lèi)的具體實(shí)現(xiàn)代碼

package util.upload;

import org.apache.commons.fileupload.ProgressListener;

public class UploadListener implements ProgressListener{

  private volatile long 
  bytesRead = 0L,//上傳的字節(jié)數(shù)
  contentLength = 0L,//總字節(jié)數(shù)
  item = 0L; 
   public UploadListener() 
    {
      super();
    }

   @Override
   public void update(long aBytesRead, long aContentLength, int anItem) {

    bytesRead = aBytesRead;
     contentLength = aContentLength;
     item = anItem;
   }
   public long getBytesRead() 
   {
     return bytesRead;
   }
   public long getContentLength() 
   {
     return contentLength;
   }

   public long getItem() 
   {
     return item;
   }
}

現(xiàn)在能獲取上傳進(jìn)度等信息了,但還需要一個(gè)servlet返回給前端,下面實(shí)現(xiàn)

package util.upload;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.commons.fileupload.ProgressListener;

import com.google.gson.Gson;
/**
 獲取上傳進(jìn)度,上傳路徑,錯(cuò)誤,上傳結(jié)果等信息
 */

public class GetProgressServlet extends HttpServlet{

 private static final long serialVersionUID = -3596466520775012991L;

 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 doPost(request, response);
 }

 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
   request.setCharacterEncoding("utf-8");
   response.setCharacterEncoding("utf-8");
   UploadListener listener= null;
   HttpSession session = request.getSession();
   String error=(String) session.getAttribute("error");
   String result= (String) session.getAttribute("result");
   String fileName=(String) session.getAttribute("filename");
   PrintWriter out = response.getWriter();
   long bytesRead = 0,contentLength = 0; 
   if (session != null)
    {
      listener = (UploadListener)session.getAttribute("LISTENER");

      if (listener == null)
      {
        return;
      }
      else
      {        
        bytesRead = listener.getBytesRead();//上傳的字節(jié)數(shù)
        contentLength = listener.getContentLength();//總字節(jié)數(shù)

      }
      //自己定義的返回格式
      String rp=bytesRead+","
          +contentLength+","
          +error+","
          +result+","
          +fileName;

      //System.out.println(rp);
      out.print(rp);
      /*   //返回json格式數(shù)據(jù)
      Map<String,Object> map=new HashMap<String,Object>();
      map.put("bytesRead", bytesRead);
      map.put("contentLength", contentLength);
      map.put("error", error);
      map.put("result", result);
      map.put("fileName", fileName);
      Gson gson=new Gson();
      String json=gson.toJson(map);
      out.print(json);*/
      out.flush();
      out.close();  
    }
 }
}

后臺(tái)上傳的功能代碼寫(xiě)完了,下面實(shí)現(xiàn)上傳的前端,首先是html

<!DOCTYPE html>
  <html>
  <head>
    <meta charset="utf-8" />
    <script type="text/javascript" src="js/upfile.js" charset="utf-8"></script>
    <link rel="stylesheet" type="text/css" href="css/upfile.css">
  </head>
  <body >
    <a href="javascript:addOne()">添加</a>
    <div id="target">
      <input type="file" id="file" name="file" onchange="addfile(event)" multiple/>
    </div>
    <span id="test">0</span>
  </body> 
</html>

界面比較簡(jiǎn)單,就一個(gè)添加的a標(biāo)簽,負(fù)責(zé)上傳的input隱藏起來(lái)
css文件主要渲染的上傳進(jìn)度的顯示

      #file {
        display: none;
      }
      .pro{
        width:500px;
      }
      .pborder {

        position: relative;
        width: 500px; /* 寬度 */
        border: 1px solid #B1D632;
        padding: 1px;
      }

      .drawpro {
        width: 0px;
        display: block;
        position: relative;
        background: #B1D632;
        color: #333333;
        height: 20px; /* 高度 */
        line-height: 20px; /* 必須和高度一致,文本才能垂直居中 */
      }

      .pspan {
        position: absolute;
        width: 500px;
        text-align: center;
        font-weight: bold;
      }

接著是前端的重點(diǎn),js文件

//顯示上傳信息的html
var upfile_html = '<div class="pborder"><div class="drawpro">'
    + '<span class="pspan">0%</span></div></div><span name="path"></span><img src="common/upload/images/del.png" style="float:right" width="20" height="20" name="del" onclick=abortUpload(this)>';

var targetDIV_id = "target";//顯示上傳文件的目標(biāo)div的ID
var httpXML = null;//發(fā)送上傳請(qǐng)求的XMLHttpRequest對(duì)象
var httpProgress = null;//發(fā)送請(qǐng)求進(jìn)度信息的XMLHttpRequest對(duì)象
var oldFileList = new Array();//修改時(shí)保存已有附件信息的列表
var uplist = new Array();//保存上傳文件的列表
var f_input;//上傳文件的input對(duì)象
var flag = true;//是否可以上傳下一個(gè)文件標(biāo)志
var uurl = "Upload";//上傳文件的請(qǐng)求url
var gurl = "getProgress";//獲取上傳進(jìn)度信息的url
var cancelFlag = 0;//取消標(biāo)志
var timer, waittimer;//定時(shí)器
var nowID = 0;//正在上傳文件的id
var ID = 0;//隊(duì)列中最后一個(gè)文件的id

/**
 * 文件對(duì)象
 */
function UploadFile(id, file) {
  this.id = id;
  this.file = file;
  this.state = 0;
  this.path = "";
}
/**
 * 初始化的方法
 */
window.onload = function init() {
  f_input = document.getElementById("file");
  var tdiv = document.getElementById(targetDIV_id);

  var oldspan = tdiv.getElementsByTagName("SPAN");

  for ( var i = 0; i < oldspan.length; i++) {
    oldFileList.push(oldspan[i].getAttribute("name"));
  }
}

/**
 * 選擇一個(gè)文件上傳
 */
function addOne() {
  f_input.value = null;
  f_input.click();
}

/**
 * 選中文件后將文件對(duì)象添加到隊(duì)列,開(kāi)始上傳
 * 
 */
function addfile(evt) {
  var f = f_input.files[0];
  if (f != undefined) {
    var uf = new UploadFile(ID, f);
    uplist.push(uf);
    var div = document.createElement("DIV");
    div.setAttribute("id", "pro" + (ID));
    div.setAttribute("class", "pro");
    div.innerHTML = upfile_html;
    var targetDiv = document.getElementById(targetDIV_id);
    targetDiv.appendChild(div);
    div.getElementsByTagName("SPAN")[1].innerHTML = "文件名:"
        + uplist[ID].file.name;
    waittimer = setInterval("upload()", 1000);
    ID++;
  }
}
/**
 * 將隊(duì)列中的文件上傳
 */
function upload() {

  if (flag == true) {

    if (uplist.length > 0) {

      var uf;
      for ( var i = 0; i < uplist.length; i++) {
        if (uplist[i].state == 0) {
          uf = uplist[i];
          uplist[i].state = 1;
          break;
        }
      }

      if (uf != undefined & uf != null) {
        flag = false;
        if (window.XMLHttpRequest) {
          httpUP = new XMLHttpRequest();
        } else if (window.ActiveXObject) {
          httpUP = new ActiveXObject("Microsoft.XMLHTTP");
        }
        var formData = new FormData();
        formData.append("file", uf.file);
        httpUP.open("POST", uurl, true);
       httpUP.upload.addEventListener('progress', uploadProgress, false);
        httpUP.send(formData);
        nowID = uf.id;
        timer = setInterval("getP()", 50);
      }
    }
  }
}

/**
 * 獲取上傳進(jìn)度等信息
 */
function getP() {
  if (window.XMLHttpRequest) {
    httpProgress = new XMLHttpRequest();
  } else if (window.ActiveXObject) {
    httpProgress = new ActiveXObject("Microsoft.XMLHTTP");
  }
  httpProgress.onreadystatechange = onProgress;
  httpProgress.open("post", gurl, true);
  httpProgress.setRequestHeader("Content-type",
      "application/x-www-form-urlencoded");
  httpProgress.send("&timeStamp=" + (new Date()).getTime());
}

/**
 * 處理返回的上傳信息,顯示到界面
 */
function onProgress() {
  if (httpProgress.readyState == 4 && httpProgress.status == 200) {
    result = httpProgress.responseText;
    var result = result.replace(/(^\s*)|(\s*$)/g, "");
    var res = result.split(",");
    var now = parseInt(res[0]);
    var all = parseInt(res[1]);
    var err = res[2];
    var state = res[3];
    var path = res[4];
    var per = (now / all * 100).toFixed(2);
    var prodiv = document.getElementById("pro" + nowID);

    if (prodiv != null & prodiv != undefined) {
      if (err != "" & err != null & err.length > 0) {
        window.clearInterval(timer);
        if (cancelFlag == 1) {
          err = "上傳終止";
          cancelFlag = 0;
        }
        prodiv.getElementsByTagName("DIV")[0].style.display = "none";
        prodiv.getElementsByTagName("SPAN")[1].innerHTML = err;
        httpUP.abort();
        flag = true;
        uplist[nowID].state = 3;
        return;
      }
      if (state == "OK") {
        prodiv.getElementsByTagName("DIV")[0].style.display = "none";
        var tmpf = uplist[nowID].file;
        prodiv.getElementsByTagName("SPAN")[1].innerHTML = "文件名:"
            + tmpf.name;
        window.clearInterval(timer);
        flag = true;
        uplist[nowID].state = 2;
        uplist[nowID].path = path;
        return;
      }
      prodiv.getElementsByTagName("DIV")[1].style.width = per * 5 + "px";
      prodiv.getElementsByTagName("SPAN")[0].innerHTML = per + "%";

    }
  }
}

/**
 * 取消上傳的方法
 */
function abortUpload(obj) {
  var idStr = obj.parentNode.id;
  var id = idStr.slice(3);
  if (uplist[id].state == 1) {
    httpUP.abort();
    flag = true;
    cancelFlag = 1;
  } else {
    uplist[id].state = 3;
  }
  document.getElementById(idStr).remove();

}
/**
 * 獲取上傳文件的路徑
 * @returns 格式化后字符串
 */
function getFileListStr() {

  var str = "";
  if (oldFileList.length > 0) {
    for ( var i = 0; i < oldFileList.length; i++) {
      if (oldFileList[i] != null & oldFileList[i] != ""
          & oldFileList[i] != undefined) {
        str = str + oldFileList[i] + ",";
      }

    }
  }
  for ( var i = 0; i < uplist.length; i++) {
    var f = uplist[i];
    if (f.state == 2) {
      str = str + f.path + ",";
    }
  }
  return str;
}
/**
 * 移除修改時(shí)已有的舊附件
 * 
 */
function removeOld(btn) {
  var num = btn.getAttribute("name");
  oldFileList[num - 1] = null;
  btn.parentNode.remove();
}
  function uploadProgress(e) {
        if (e.lengthComputable) {
          var iBytesUploaded = e.loaded;
          var iBytesTotal = e.total;
          document.getElementById("test").innerHTML=iBytesUploaded+"/"+iBytesTotal;
        }
      }

使用ajax發(fā)送上傳文件,獲取上傳進(jìn)度,結(jié)果等信息。
使用的html5的file API,所以必須ie9以上的才可以兼容,火狐還有個(gè)問(wèn)題,ajax請(qǐng)求不立即返回,直到所有ajax請(qǐng)求都發(fā)送完了,才都返回同一個(gè)結(jié)果,這就導(dǎo)致上傳進(jìn)度不顯示。不過(guò)上傳進(jìn)度信息也可以使用html5的file api獲取,其中加了一點(diǎn)代碼,頁(yè)面下面test的div里的數(shù)值就是在前端獲取到的進(jìn)度。

上傳的都實(shí)現(xiàn)完了,接著是處理上傳后的臨時(shí)文件,因?yàn)槭褂玫膗uid命名文件,所以文件會(huì)生成很多,沒(méi)用的需要定時(shí)處理。使用ServletContextListener:
在 Servlet API 中有一個(gè) ServletContextListener 接口,它能夠監(jiān)聽(tīng) ServletContext 對(duì)象的生命周期,實(shí)際上就是監(jiān)聽(tīng) Web 應(yīng)用的生命周期。

當(dāng)Servlet 容器啟動(dòng)或終止Web 應(yīng)用時(shí),會(huì)觸發(fā)ServletContextEvent 事件,該事件由ServletContextListener 來(lái)處理。在 ServletContextListener 接口中定義了處理ServletContextEvent 事件的兩個(gè)方法。
利用其特性,實(shí)現(xiàn)定時(shí)刪除臨時(shí)文件的功能,代碼如下:

package util.upload;

import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.Properties;
import java.util.Timer;
import java.util.TimerTask;

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

/** 
 * 時(shí)間監(jiān)聽(tīng)器 
 *  
 * 
 */ 
public class TempFileListener implements ServletContextListener { 
  private Timer timer; 
  private SystemTaskTest systemTask; 
  private static String every_time_run; 
  static { 
    Properties prop = new Properties(); 
    InputStream inStrem = TempFileManager.class.getClassLoader() 
        .getResourceAsStream("tempfile.properties"); 
    try { 
      prop.load(inStrem); 
      System.out.println(inStrem);
      every_time_run = prop.getProperty("every_time_run"); 

    } catch (IOException e) { 
      e.printStackTrace(); 
    } finally { 
      try { 
        inStrem.close(); 
      } catch (IOException e) { 
        e.printStackTrace(); 
      } 
    } 
  } 

  // 監(jiān)聽(tīng)器初始方法 
  public void contextInitialized(ServletContextEvent sce) { 

    timer = new Timer(); 
    systemTask = new SystemTaskTest(sce.getServletContext() 
        .getRealPath("/"), sce.getServletContext()); 
    try { 
      System.out.println("定時(shí)器已啟動(dòng)");
      // 監(jiān)聽(tīng)器獲取網(wǎng)站的根目錄 
      String path = sce.getServletContext().getRealPath("/"); 
      Long time = Long.parseLong(every_time_run) * 1000;// 循環(huán)執(zhí)行的時(shí)間 
      System.out.println("time" + time);  
      // 第一個(gè)參數(shù)是要運(yùn)行的代碼,第二個(gè)參數(shù)是從什么時(shí)候開(kāi)始運(yùn)行,第三個(gè)參數(shù)是每隔多久在運(yùn)行一次。重復(fù)執(zhí)行 
      timer.schedule(systemTask, 10000, time); 
      System.out.println("已經(jīng)添加任務(wù)調(diào)度表");
    } catch (Exception e) { 
      e.printStackTrace();
    } 
  } 

  public void contextDestroyed(ServletContextEvent sce) { 
    try { 
      timer.cancel(); 
    } catch (Exception e) { 
    } 
  } 
} 

/** 
 * 時(shí)間任務(wù)器 
 * 
 */ 
class SystemTaskTest extends TimerTask { 
  private ServletContext context; 
  private String path; 
  public SystemTaskTest(String path, ServletContext context) { 
    this.path = path; 
    this.context = context; 
  } 

  /** 
   * 把要定時(shí)執(zhí)行的任務(wù)就在run中 
   */ 
  public void run() {  
    TempFileManager etf;   
    try { 

      System.out.println("開(kāi)始執(zhí)行任務(wù)!");
      // 需要執(zhí)行的代碼 
      System.out.println(new Date().toLocaleString()); 

      etf = new TempFileManager(path); 
      etf.run();    

      System.out.println("指定任務(wù)執(zhí)行完成!");
    } catch (Exception e) { 
      e.printStackTrace(); 
    } 
  } 
} 

上面只是監(jiān)聽(tīng)器,負(fù)責(zé)定時(shí)調(diào)用刪除臨時(shí)文件的方法,具體實(shí)現(xiàn)是下面的類(lèi)

package util.upload;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.Properties;


/** 
 * 刪除服務(wù)器上的文件 
 * 
 */ 

public class TempFileManager implements Runnable { 
  private String path;//路徑 

  private static String RETENTION_TIME = "1440";// 文件保存的時(shí)間 一天單位分
  static { 
    Properties prop = new Properties(); 
    InputStream inStrem = TempFileManager.class.getClassLoader() 
        .getResourceAsStream("execl.properties"); 
    try { 
      prop.load(inStrem); 
      RETENTION_TIME = prop.getProperty("file_retention_time"); 

    } catch (IOException e) { 
      e.printStackTrace(); 
    } finally { 
      try { 
        inStrem.close(); 
      } catch (IOException e) { 
        e.printStackTrace(); 
      } 
    } 
  } 
  /** 
   * 構(gòu)造函數(shù)。初始化參數(shù) 
   * @param path 
   */ 
  public TempFileManager(String path) { 
    this.path = path; 

  } 
  /** 
   * 把線程要執(zhí)行的代碼放在run()中 
   */ 
  public void run() { 
    System.out.println("文件管理開(kāi)始========="); 
    path = path + "upload"; 
    System.out.println("文件管理路徑===" + path); 
    File file = new File(path); 
    deletefiles(file); 
  } 

  /** 
   * 批量刪除文件 
   *  
   * @param folder 
   */ 
  public void deletefiles(File folder) { 
  if(folder.isDirectory()){

    File[] files = folder.listFiles();
    if(files.length<=0){
      if(!folder.getAbsolutePath().equalsIgnoreCase(path)){
      if(canDeleteFile(folder)){
        if (folder.delete()) { 
          System.out.println("文件夾" + folder.getName() + "刪除成功!"); 
        } else { 
          System.out.println("文件夾" + folder.getName() 
              + "刪除失敗!此文件夾內(nèi)的文件可能正在被使用"); 
        } 
      }
      }
    }
    for (int i = 0; i < files.length; i++) { 

      if(files[i].isDirectory())
      {
      deletefiles(files[i]);
      }else{
        deleteFile(files[i]); 
      }

    } 
  }
  } 

  /** 
   * 刪除文件 
   *  
   * @param file 
   */ 
  private void deleteFile(File file) { 
    try { 
      if (file.isFile()) { 
        // 刪除符合條件的文件 
        if (canDeleteFile(file)) { 
          if (file.delete()) { 
            System.out.println("文件" + file.getName() + "刪除成功!"); 
          } else { 
            System.out.println("文件" + file.getName() 
                + "刪除失敗!此文件可能正在被使用"); 
          } 
        } else { 

        } 
      } else { 
        System.out.println("沒(méi)有可以刪除的文件了"); 
      } 

    } catch (Exception e) { 
      System.out.println("刪除文件失敗========"); 
      e.printStackTrace(); 
    } 
  } 

  /** 
   * 判斷文件是否能夠被刪除 
   */ 
  private boolean canDeleteFile(File file) { 
    Date fileDate = getfileDate(file); 
    Date date = new Date(); 
    long time = (date.getTime() - fileDate.getTime()) / 1000 / 60 
        - Integer.parseInt(RETENTION_TIME);// 當(dāng)前時(shí)間與文件間隔的分鐘 
//    System.out.println("time=="+time);
    if (time > 0) { 
      return true; 
    } else { 
      return false; 
    } 

  } 

  /** 
   * 獲取文件最后的修改時(shí)間 
   *  
   * @param file 
   * @return 
   */ 
  private Date getfileDate(File file) { 
    long modifiedTime = file.lastModified(); 
    Date d = new Date(modifiedTime); 
    return d; 
  } 

} 

判斷文件是否超時(shí),超時(shí)就自動(dòng)刪除,并且能自動(dòng)刪除文件夾。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家學(xué)習(xí)java程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • Java棧的運(yùn)用之中綴表達(dá)式求值詳解

    Java棧的運(yùn)用之中綴表達(dá)式求值詳解

    本文來(lái)介紹一題中綴表達(dá)式求值的問(wèn)題,就是給定一個(gè)中綴計(jì)算式,編寫(xiě)程序?qū)⑦@個(gè)式子運(yùn)算結(jié)果給計(jì)算出來(lái),其實(shí)和后綴表達(dá)式的思路差不多,都是棧的運(yùn)用問(wèn)題,感興趣的可以了解一下
    2022-11-11
  • Java實(shí)現(xiàn)MD5加密及解密的代碼實(shí)例分享

    Java實(shí)現(xiàn)MD5加密及解密的代碼實(shí)例分享

    如果對(duì)安全性的需求不是太高,MD5仍是使用非常方便和普及的加密方式,比如Java中自帶的MessageDigest類(lèi)就提供了支持,這里就為大家?guī)?lái)Java實(shí)現(xiàn)MD5加密及解密的代碼實(shí)例分享:
    2016-06-06
  • Java設(shè)計(jì)模式之代理模式

    Java設(shè)計(jì)模式之代理模式

    這篇文章介紹了Java設(shè)計(jì)模式之代理模式,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-09-09
  • SPFA 算法實(shí)例講解

    SPFA 算法實(shí)例講解

    下面小編就為大家?guī)?lái)一篇SPFA 算法實(shí)例講解。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-07-07
  • Quarkus改造Pmml模型項(xiàng)目異常記錄及解決處理

    Quarkus改造Pmml模型項(xiàng)目異常記錄及解決處理

    這篇文章主要為大家介紹了Quarkus改造Pmml模型項(xiàng)目是遇到的異常記錄以及解決方法,有需要的同學(xué)可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2022-02-02
  • java動(dòng)態(tài)添加外部jar包到classpath的實(shí)例詳解

    java動(dòng)態(tài)添加外部jar包到classpath的實(shí)例詳解

    這篇文章主要介紹了java動(dòng)態(tài)添加外部jar包到classpath的實(shí)例詳解的相關(guān)資料,希望通過(guò)本文能幫助到大家,需要的朋友可以參考下
    2017-09-09
  • 基于Java網(wǎng)絡(luò)編程和多線程的多對(duì)多聊天系統(tǒng)

    基于Java網(wǎng)絡(luò)編程和多線程的多對(duì)多聊天系統(tǒng)

    這篇文章主要介紹了基于Java網(wǎng)絡(luò)編程和多線程的多對(duì)多聊天系統(tǒng),文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java網(wǎng)絡(luò)編程的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04
  • Java貪心算法超詳細(xì)講解

    Java貪心算法超詳細(xì)講解

    人之初性本善,但是隨著自身的經(jīng)歷、生活環(huán)境等因素的影響,人逐漸會(huì)生出貪嗔癡。實(shí)際上不光人有貪念,我們的算法也會(huì)有貪念,今天就和大家介紹下一個(gè)有貪念的算法模型---貪心算法,看看一個(gè)算法是怎么產(chǎn)生貪念的
    2022-05-05
  • 詳解SSM框架下結(jié)合log4j、slf4j打印日志

    詳解SSM框架下結(jié)合log4j、slf4j打印日志

    本篇文章主要介紹了詳解SSM框架下結(jié)合log4j、slf4j打印日志,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-11-11
  • Java數(shù)據(jù)結(jié)構(gòu)之對(duì)象的比較

    Java數(shù)據(jù)結(jié)構(gòu)之對(duì)象的比較

    比較對(duì)象是面向?qū)ο缶幊陶Z(yǔ)言的一個(gè)基本特征,下面這篇文章主要給大家介紹了關(guān)于Java數(shù)據(jù)結(jié)構(gòu)之對(duì)象的比較,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-02-02

最新評(píng)論