• [原创]Java中使用File类的list方法获取一定数量的文件:FilenameFilter接口的特殊用法


    前言:有时候我们可能会遇到这样一个问题:需要遍历一个包含极多文件的文件夹,首先想到的肯定是使用File.list()方法,该方法返回一个String[],但是如果文件达到几亿呢?这个时候我们就需要分批获取文件夹中的文件了

    解决方法:分批获取文件,每次获取一定数量

      而File类中没有直接筛选数量的方法和参数,但是有list(FilenameFilter)方法,FilenameFilter一般是用来过滤返回文件列表的文件类型的,这里我们借助他来实现返回一定数量文件的功能。

      首先创建一个类,实现FilenameFilter接口:

    package test;
    
    import java.io.File;
    import java.io.FilenameFilter;
    
    /**
     * 文件数量过滤类
     * @author Guangshan
     */
    public class FileNumFilter implements FilenameFilter {
        
        private int maxFileNum;
        private int fileCount; //记录文件数
        
        public  FileNumFilter(int maxFileNum) {
            this.maxFileNum = maxFileNum;
        }
        
        @Override
        public boolean accept(File dir, String name) {
            if(fileCount >= maxFileNum)
                return false;
            else
                fileCount++;
            return true;
        }
    }
    View Code

      代码很简单,就是使用类成员变量来记录数量变化,每收到一个文件数量加一,直到达到规定的数量,则不再接受文件。

      调用也很简单:

    package test;
    
    import java.io.File;
    
    public class Test {
        public static void main(String[] args) {
            File test = new File("D:\test");
            String[] fileList = test.list(new FileNumFilter(10));
        }
    }
    View Code

      这样获取的String[]的size就是10了。

    PS:当使用while(true)进行死循环时,一定要使用sleep(1),哪怕只有1ms,对CPU的占用也会极大的减少。

    PPS:小技巧,判断一个文件正在使用(包括被其他程序使用,被作为InputStream打开等等情况),可以使用:

    File a = new File(path);

    boolean b = a.renameTo(a);

    根据b可以判断是否在占用

  • 相关阅读:
    [SDOI2009]HH的项链
    [PA2010]Riddle
    纪念品
    [Code+#4]最短路
    [JSOI2007]文本生成器
    绝世好题
    一个输入框提示列表效果
    iGOOGLE分栏
    获取图片地址然后显示在input中
    网页配色工具。
  • 原文地址:https://www.cnblogs.com/guangshan/p/4425429.html
Copyright © 2020-2023  润新知