File文件与Map集合的综合练习

1. File类的list功能递归遍历filedir
2. 遍历文件使用文件过滤器获得目录中有几种不同的文件格式以及文件的个数
   结果存储到map集合中 
   {java:4,txt:2,doc:8}
3.根据map 集合的 key 创建目录  例如java 目录 并把文件移动到对应的目录中
  复制(字节流进行文件复制)

4. 定义一个方法  把map 集合中文件和文件记录数据写入到一个文件中 要求按照从高到低写入到文件
   对map 集合的value 进行排序
    filestatus:
    文件类型   个数
    java           8
    doc           6

一、遍历文件,并统计文件内后缀名不同的文件的个数

分析:首先需要用FileFilter过滤器删选得到我们所需要的文件(如后缀名为doc,txt,jpg等)

由于FileFilter是个接口,所以我们要写一个类去实现它,代码如下:

class JavaFilter implements FileFilter{
    //定义一个属性  map 存储记录文件
    private Map<String,Integer> map ;
    public JavaFilter(Map<String, Integer> map) {
        this.map = map;
    }
    @Override
    public boolean accept(File pathname) {
        //递归遍历文件
        mylistFileToMap(pathname,map);
        return true;
    }
    private void mylistFileToMap(File filterFile,Map<String,Integer> fileMap){
        //获得文件扩展名
        if (filterFile.isFile()){
            String name = filterFile.getName();
            String extendName = name.substring(name.lastIndexOf(".")+1);
            //判断  map 集合存在这个扩展名 计数器+1 不存在  设置为1
            if (fileMap.containsKey(extendName)){
                fileMap.put(extendName,fileMap.get(extendName)+1);
            }else {
                fileMap.put(extendName,1);
            }
        }else if (filterFile.isDirectory()){
            //递归列举目录中的文件
            File[] files = filterFile.listFiles();
            for (File file : files) {
               mylistFileToMap(file,fileMap);
            }
        }
    }
}

 二、文件复制,根据map 集合的 key 创建目录  例如java 目录 并把文件移动到对应的目录中
  复制(字节流进行文件复制)

分析:

/*
 * 1. 遍历Map ,根据key 去原始目录中查找对应的文件存储到一个文件集合中
 *    Map<String,List<File>>
 * 2. 遍历map 集合 根据key 创建目录 mkdirs()
 *    把对应的集合  写一个文件复制的方法  复制到对应目录  字节流
 */
public static void xxxFiles( Map<String,Integer> fileMap,File file) throws IOException {

        Map<String,List<File>> listMap = new HashMap<>();//用来输出不同文件后缀名的集合  [doc,...doc]
        Set<String> setMap = fileMap.keySet();
        List<File> fileList = new ArrayList<>();//
        String[] list = file.list();
        for (String key : setMap) {//遍历file文件和map集合的key比较
            for (String lastName : list) {//遍历把内容写进list集合+lastname==helloword.txt
                String substring = lastName.substring(lastName.indexOf(".") + 1);
                if (substring.equals(key)){
                    File f = new File(lastName);//f=R-C1.jpg
                    fileList.add(f);
                    ArrayList<File> copy = new ArrayList<>(fileList);
                    listMap.put(key,copy);
                }
            }
            fileList.clear();
        }
        Set<Map.Entry<String,List<File>>> fileSet = listMap.entrySet();
        for (Map.Entry<String, List<File>> key : fileSet) {
            System.out.println("key:"+ key.getKey());
            for (File temp : key.getValue()) {
                File f = new File(file,key+"\\"+temp.getName());
                if (!f.exists()){
                    createNewFile(key.getKey(),temp.getName(),list);//list是文件的数组
                }
                else System.out.println("文件已存在!");
            }
        }
    }
private static void  createNewFile(String key,String fileName,String[] list) throws IOException {
        File f = new File("F:\\ioTest\\"+key);
        if (!f.exists()) {
            f.mkdirs();
            File path1 = new File("F:\\ioTest\\"+key+"\\"+fileName);// ioTest\jpg\c1.jpg
            for (String temp : list) {
                File path2 = new File("F:\\FileTest"+"\\"+temp);// FileTest\c1.jpg
                if (temp.equals(fileName)){
                    copy(path2.getPath(),path1.getPath());
                }
            }
        }
    }
//复制的方法有很多种,我采用的是缓冲字节流,一次复制一个字节数组
public static void copy(String src,String des){
        try {
            BufferedInputStream bfis = new BufferedInputStream(new FileInputStream(src));
            BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(des));
            int len ;
            byte[] bytes = new byte[4096*1024];
            while ((len=bfis.read(bytes))!=-1) {
                bos.write(bytes,0,len);
            }
            bfis.close();
            bos.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

 

三、排序

分析:

        // treeMap 自动实现 map集合的key排序
        // 但我们这里要求的是map 集合的value 排序
        // 排序 Collections   本质就是对map 中的entry 排序

public static void listDir(File file) throws IOException {
        Map<String,Integer> fileMap = new HashMap<>();
        file.listFiles(new JavaFilter(fileMap));
       // System.out.println("file:"+Arrays.toString(files));
        System.out.println("统计结果: "+fileMap);
        //文件复制
        xxxFiles(fileMap,file);

        Set<Map.Entry<String,Integer>> entries = fileMap.entrySet();
        // 把set 转换为list
        List<Map.Entry<String,Integer>> entryList = new ArrayList<>();
        for (Map.Entry<String, Integer> entry : entries) {
            entryList.add(entry);
        }
        System.out.println("排序前:"+entries);
        //排序
        Collections.sort(entryList, new Comparator<Map.Entry<String, Integer>>() {
            @Override
            public int compare(Map.Entry<String, Integer> entry1, Map.Entry<String, Integer> entry2) {
                return entry1.getValue()-entry2.getValue();
            }
        });
        System.out.println("排序后:"+entryList);
        //集合写入文件BufferWriter
        File fileWriter = new File("src\\week03\\day03\\result\\result.txt");
        BufferedWriter bw = new BufferedWriter(new FileWriter(fileWriter));
        bw.write("类型\t个数");
        bw.newLine();
        for (Map.Entry<String, Integer> stringIntegerEntry : entryList) {
            bw.write(stringIntegerEntry.getKey()+"\t\t"+stringIntegerEntry.getValue());
            bw.newLine();
        }
        bw.close();
    }

四、主方法

public static void main(String[] args) throws IOException {
        listDir(new File("F:\\FileTest"));
    }

五、结果


 下图中画圆圈的便是所复制的文件夹了。

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值