`

学习apache commons-io类库中的文件清除器

    博客分类:
  • java
 
阅读更多
学习apache commons-io 1.4类库中的FileCleaner(文件清除器)
  它被用来清理象上传大文件时产生的临时文件之类,这些临时文件在不再被使用的时候会自动被删除.这会被
org.apache.commons.io.FileCleaningTracker的一个实例启动的一个守护线程默默执行.
共有三个类:
  1、 类FileDeleteStrategy
import java.io.File;
import java.io.IOException;
public class FileDeleteStrategy {
   
    public static final FileDeleteStrategy NORMAL = new FileDeleteStrategy("Normal");   
    public static final FileDeleteStrategy FORCE = new ForceFileDeleteStrategy(); 
    private final String name;
    protected FileDeleteStrategy(String name) {
        this.name = name;
    }
 
    public boolean deleteQuietly(File fileToDelete) {
        if (fileToDelete == null || fileToDelete.exists() == false) {
            System.out.println("File delled!!");
            return true;
        }
        try {
            return doDelete(fileToDelete);
        } catch (IOException ex) {
            return false;
        }
    }
 
    public void delete(File fileToDelete) throws IOException {
        if (fileToDelete.exists() && doDelete(fileToDelete) == false) {
            throw new IOException("Deletion failed: " + fileToDelete);
        }
    }
    
    protected boolean doDelete(File fileToDelete) throws IOException {
        return fileToDelete.delete();
    }
  
    public String toString() {
        return "FileDeleteStrategy[" + name + "]";
    }
 
    static class ForceFileDeleteStrategy extends FileDeleteStrategy {
      
        ForceFileDeleteStrategy() {
            super("Force");
        }
    
        protected boolean doDelete(File fileToDelete) throws IOException {
           // FileUtils.forceDelete(fileToDelete);
            return true;
        }
    }
}
2、FileCleaningTracker类,这个类用于跟踪要删除的文件
import java.io.File;
import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;
import java.util.Collection;
import java.util.Vector;
public class FileCleaningTracker {
    
    ReferenceQueue q = new ReferenceQueue();//引用队列
    final Collection  trackers = new Vector();  // synchronized 
    /**
     * Whether to terminate the thread when the tracking is complete.
     */
    volatile boolean exitWhenFinished = false;
    //用于删除文件的线程
    Thread reaper;
    
    public void track(File file, Object marker) {
        track(file, marker, (FileDeleteStrategy) null);
    }
   
    public void track(File file, Object marker, FileDeleteStrategy deleteStrategy) {
        if (file == null) {
            throw new NullPointerException("The file must not be null");
        }
        addTracker(file.getPath(), marker, deleteStrategy);
    }
   
    public void track(String path, Object marker) {
        track(path, marker, (FileDeleteStrategy) null);
    }
 
    public void track(String path, Object marker, FileDeleteStrategy deleteStrategy) {
        if (path == null) {
            throw new NullPointerException("The path must not be null");
        }
        addTracker(path, marker, deleteStrategy);
    }
   
    private synchronized void addTracker(String path, Object marker, FileDeleteStrategy deleteStrategy) {
        // synchronized block protects reaper
        if (exitWhenFinished) {
            throw new IllegalStateException("No new trackers can be added once exitWhenFinished() is called");
        }
        if (reaper == null) {
            reaper = new Reaper();
            reaper.start();
        }
        trackers.add(new Tracker(path, deleteStrategy, marker, q));
    }
    
    public int getTrackCount() {
        return trackers.size();
    }
    public synchronized void exitWhenFinished() {
        // synchronized block protects reaper
        exitWhenFinished = true;
        if (reaper != null) {
            synchronized (reaper) {
                reaper.interrupt();
            }
        }
    }
   
    private final class Reaper extends Thread {
        Reaper() {
            super("File Reaper");
            setPriority(Thread.MAX_PRIORITY);
            setDaemon(true);//设置为守护线程
        }
       
        public void run() {
            // thread exits when exitWhenFinished is true and there are no more tracked objects
            while (exitWhenFinished == false || trackers.size() > 0) {
                Tracker tracker = null;
                try {
                    // Wait for a tracker to remove.
                    tracker = (Tracker) q.remove();
                } catch (Exception e) {
                    continue;
                }
                if (tracker != null) {
                    tracker.delete();
                    tracker.clear();
                    trackers.remove(tracker);
                }
            }
        }
    }
  
    private static final class Tracker extends PhantomReference {//虚引用
    
        private final String path;  
        private final FileDeleteStrategy deleteStrategy;
        Tracker(String path, FileDeleteStrategy deleteStrategy, Object marker, ReferenceQueue queue) {
            super(marker, queue);
            this.path = path;
            this.deleteStrategy = (deleteStrategy == null ? FileDeleteStrategy.NORMAL : deleteStrategy);
        }
         public boolean delete() {
            return deleteStrategy.deleteQuietly(new File(path));
        }
    }
}
3、FileCleaner类
import java.io.File;
public class FileCleaner {
    /**
     * The instance to use for the deprecated, static methods.
     */
    static final FileCleaningTracker theInstance = new FileCleaningTracker();
    
    public static void track(File file, Object marker) {
        theInstance.track(file, marker);
    }
    
    public static void track(File file, Object marker, FileDeleteStrategy deleteStrategy) {
        theInstance.track(file, marker, deleteStrategy);
    }
    
    public static void track(String path, Object marker) {
        theInstance.track(path, marker);
    }
    
    public static void track(String path, Object marker, FileDeleteStrategy deleteStrategy) {
        theInstance.track(path, marker, deleteStrategy);
    }
   
    public static int getTrackCount() {
        return theInstance.getTrackCount();
    }
    
    public static synchronized void exitWhenFinished() {
        theInstance.exitWhenFinished();
    }
   
    public static FileCleaningTracker getInstance() {
        return theInstance;
    }
    //简单测试
    public static void main(String[] args){
         getInstance().track("c:\\java\\1.txt", new Object());
         getInstance().track("c:\\java\\2.txt",new Object());
         System.gc();
         System.exit(0);
    }
    
}
分享到:
评论

相关推荐

    Apache commons-io-2.5.jar

    1. **IOUtils**: IOUtils是Apache Commons IO中的核心类之一,它提供了大量静态方法,用于处理各种输入/输出流。例如,你可以使用IOUtils.copy()方法轻松地将一个输入流的内容复制到一个输出流,或者使用IOUtils....

    commons-io-2.8.0-API文档-中英对照版.zip

    赠送Maven依赖信息文件:commons-io-2.8.0.pom; 包含翻译后的API文档:commons-io-2.8.0-javadoc-API文档-中文(简体)-英语-对照版.zip; Maven坐标:commons-io:commons-io:2.8.0; 标签:commons、中英对照文档、...

    commons-io-2.5-API文档-中文版.zip

    赠送Maven依赖信息文件:commons-io-2.5.pom; 包含翻译后的API文档:commons-io-2.5-javadoc-API文档-中文(简体)版.zip; Maven坐标:commons-io:commons-io:2.5; 标签:commons、io、中文文档、jar包、java; ...

    commons-io-2.2-API文档-中文版.zip

    赠送jar包:commons-io-2.2.jar; 赠送原API文档:commons-io-2.2-javadoc.jar; 赠送源代码:commons-io-2.2-sources.jar; 包含翻译后的API文档:commons-io-2.2-javadoc-API文档-中文(简体)版.zip 对应Maven...

    commons-io-2.11.0-API文档-中文版.zip

    赠送Maven依赖信息文件:commons-io-2.11.0.pom; 包含翻译后的API文档:commons-io-2.11.0-javadoc-API文档-中文(简体)版.zip; Maven坐标:commons-io:commons-io:2.11.0; 标签:commons、中文文档、jar包、java...

    commons-io-1.3.2-API文档-中文版.zip

    赠送Maven依赖信息文件:commons-io-1.3.2.pom; 包含翻译后的API文档:commons-io-1.3.2-javadoc-API文档-中文(简体)版.zip; Maven坐标:commons-io:commons-io:1.3.2; 标签:commons、io、中文文档、jar包、java...

    commons-io-2.7-API文档-中文版.zip

    赠送Maven依赖信息文件:commons-io-2.7.pom; 包含翻译后的API文档:commons-io-2.7-javadoc-API文档-中文(简体)版.zip; Maven坐标:commons-io:commons-io:2.7; 标签:commons、jar包、java、中文文档; 使用...

    开发工具 commons-io-1.3.2

    开发工具 commons-io-1.3.2开发工具 commons-io-1.3.2开发工具 commons-io-1.3.2开发工具 commons-io-1.3.2开发工具 commons-io-1.3.2开发工具 commons-io-1.3.2开发工具 commons-io-1.3.2开发工具 commons-io-1.3.2...

    commons-io-2.7-API文档-中英对照版.zip

    赠送jar包:commons-io-2.7.jar 赠送原API文档:commons-io-2.7-javadoc.jar 赠送源代码:commons-io-2.7-sources.jar 包含翻译后的API文档:commons-io-2.7-javadoc-API文档-中文(简体)-英语-对照版.zip 对应...

    commons-io-2.11.0-API文档-中英对照版.zip

    赠送Maven依赖信息文件:commons-io-2.11.0.pom; 包含翻译后的API文档:commons-io-2.11.0-javadoc-API文档-中文(简体)-英语-对照版.zip; Maven坐标:commons-io:commons-io:2.11.0; 标签:commons、jar包、java...

    commons-fileupload-1.3.3.jar和commons-io-2.6.jar

    在Java开发中,上传文件是一项常见的任务,而`commons-fileupload-1.3.3.jar`和`commons-io-2.6.jar`是Apache Commons项目中的两个重要库,专门用于处理HTTP请求中的文件上传功能。这两个库为开发者提供了便捷、高效...

    commons-io-2.4 包含了所有commons-io的jar包和源码

    在本案例中,我们讨论的是"commons-io-2.4"版本,这个版本包含了完整的Apache Commons IO库的jar包和源代码,适用于JDK 1.6及以上版本。 Apache Commons IO 提供了许多实用工具类,使得开发者在处理输入/输出操作时...

    commons-io-2.11.0-bin.zip

    在描述中提到的"org.apache.commons.io.FileUtils"是Apache Commons IO中的一个关键类,它提供了大量静态方法来简化文件操作,如复制、移动、删除、读写文件等。以下是一些FileUtils类中的核心功能: 1. 文件复制:...

    commons-io-2.11.0.rar

    "commons-io-2.11.0.rar"是Apache Commons IO库的版本2.11.0的压缩包文件,包含了该版本的所有源代码、类库和相关的文档。 Apache Commons IO库的核心特性包括: 1. 文件操作:提供了一系列静态方法来操作文件,如...

    Commons-io-2.11.0.jar

    commons-io-2.11.0.jar是这个项目在版本2.11.0时的jar文件,用于在Java应用程序中引入这些实用功能。 主要功能: 文件和目录操作工具:例如文件复制、移动、删除、查找等。 流处理工具:提供了易于使用的包装器和...

    commons-fileupload-1.2.1.jar 和commons-io-1.4.jar

    在实际开发中,当你需要在Web应用中实现文件上传功能时,首先会配置`commons-fileupload-1.2.1.jar`来解析请求,然后利用`commons-io-1.4.jar`处理上传后的文件,比如保存到服务器的指定目录,或者进行一些预处理...

    commons-io-2.6.jar下载

    Commons IO 是 Apache Software Foundation 开发的一个 Java 库,它的核心组件是 `commons-io-2.6.jar`。这个版本的 JAR 文件包含了丰富的输入/输出流、文件操作、I/O 流工具类以及与文件系统交互的相关功能。下面将...

    Java IO commons-io-2.5.jar

    `commons-io-2.5.jar` 是Apache Commons项目的一部分,它提供了一系列增强和扩展了Java标准IO库的类和方法。这个库为开发者提供了更高效、更便捷的方式来执行常见的文件、目录和流操作。 一、Java IO 基础 Java IO ...

    commons-io-2.4.jar包 官方免费版

    在压缩包中,除了`commons-io-2.4.jar`本身,还有其他URL文件,可能是提供额外资源的链接,如"去脚本之家看看.url"可能指向一个编程资源网站,"领取天猫淘宝内部优惠券.url"可能是促销信息,而"服务器软件.url"可能...

    commons-fileupload-1.2.1.jar与commons-io-1.3.2.jar

    标题中的"commons-fileupload-1.2.1.jar与commons-io-1.3.2.jar"涉及的是两个在Java开发中常用的开源库,主要用于处理HTTP协议上传文件的需求。这两个库在JSP(JavaServer Pages)开发中尤为重要,因为它们简化了...

Global site tag (gtag.js) - Google Analytics