java基础 File与递归练习 使用文件过滤器筛选将指定文件夹下的小于200K的小文件获取并打印按层次打印(包括所有子文件夹的文件) 多层文件夹情况统计文件和文件夹的数量 统计已知类型的数量 未知类型的数量

package com.swift.kuozhan;

import java.io.File;
import java.io.FileFilter;

/*使用文件过滤器筛选将指定文件夹下的小于200K的小文件获取并打印(包括所有子文件夹的文件)。*/

public class kuaozhan1 {

    public static void main(String[] args) {

        File dir = new File("c:/");
        if(!dir.exists()) {
            throw new RuntimeException("该文件夹不存在");
        }
        get200(dir, 0);
    }

    private static void get200(File dir, int length) {
        if(!dir.exists()) {
            throw new RuntimeException("该文件夹不无访问权限");
        }
        for (int i = 0; i < length; i++)
            System.out.print("\t");
        System.out.println(dir);
        File[] files = dir.listFiles(new FileFilter() {

            @Override
            public boolean accept(File pathname) {
                if (pathname.isDirectory())
                    return true;
                 if (pathname.isHidden())
                 return false;

                if (pathname.length() / 1024 < 200)
                    return true;
                return false;
            }

        });

        for (File file : files) {
            if (file.isDirectory()) {
                get200(file, length + 1);
            } else {
                for (int i = 0; i < length; i++)
                    System.out.print("\t");
                System.out.println("\t" + file);
            }
        }
    }
}

统计文件夹中(不包含子文件夹)文件大于10byte的文件数量并删除这些文件

package com.swift.base;

import java.io.File;
import java.io.FileFilter;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;


/*训练知识点
1.File对象的删除
2.文件判断功能
3.文件的大小
4.listFiles

训练描述
获取指定路径的文件对象
如果文件对象存在且是文件夹,输出文件夹下(不包含子文件夹)文件大小大于10的文件个数及大小大于10文件的名称
如果大小大于10的文件大于1,根据键盘录入选择是否删除这些文件
如果大小大于10的文件小于1,控制台提示没有文件大于10

操作步骤描述
1.使用File类的构造方法创建文件对象
2.判断该文件是否存在且是文件夹,如果是:
    a).获取文件夹下所有的文件对象
    b).创建集合来存放需要删除的文件对象
    c).遍历所有文件夹下所有的文件对象
        i).如果文件对象是文件且文件的大小大于10就添加文件到集合中
    d).如果集合中的元素大于1:
        i).输出集合中元素的个数及所有集合中所有的元素
        ii).提示是否进行删除
        iii).如果输入删除,遍历集合中所有的file对象进行删除,并提示**文件已经删除了
    e).输出提示文件夹下没有大小大于10的文件对象*/

public class BaseKnowledge5 {

    public static void main(String[] args) {
        
        File dir=new File("c:/abc");
        if(dir.exists()&&dir.isDirectory()) {
            File[] files = dir.listFiles(new FileFilter() {

                @Override
                public boolean accept(File pathname) {
                    if(pathname.isDirectory()) 
                        return false;
                    if(pathname.length()>10) 
                        return true;
                    return false;
                }});

            List<File> list=new ArrayList<>();
            for(File file:files) {
                list.add(file);
            }
            if(list.size()>1) {
                System.out.println(list.size());
                for(File file:list) {
                    System.out.println(file);
                }
                Scanner scan =new Scanner(System.in);
                System.out.println("请输入是否删除? 回答 删除 和 不删除");
                String str=scan.nextLine();
                if("删除".equals(str)) {
                    for(File file:list) {
                        file.delete();
                    }
                    System.out.println("文件已删除");
                }
            }else {
                System.out.println("没有大于10的文件");
            }
            
        }
    }

}

 

 统计多层文件夹下文件和文件夹的数量

package com.swift.Test;

import java.io.File;

/*训练描述

要求:获取指定路径下文件及文件夹的个数,包含子目录中的文件及文件夹
步骤:
    1. 指定要打印的目录File对象
    2. 调用getFileAll()方法
        2.1 获取指定目录中的所有File对象
        2.2 遍历得到每一个File对象
        2.3 判断当前File 对象是否是目录
            判断结果为true,说明为目录,通过递归,再次调用步骤2的getFileAll()方法
            判断结果为false,说明是文件,打印文件的路径*/

public class DemoFile {
    
    public static int dirNums;
    public static int fileNums;
    
    public static void main(String[] args) {
        
        File dir = new File("c:/abc");
        getFileAll(dir,0);
        System.out.println("文件夹的数量是:"+dirNums);
        System.out.println("文件的数量是"+fileNums);
        
    }

    private static void getFileAll(File dir,int deep) {
        dirNums++;
        for(int i=0;i<deep;i++) {
            System.out.print("\t");
        }
        System.out.println(dir);
        File[] files=dir.listFiles();
        for(File file:files) {
            if(file.isDirectory()) {
                getFileAll(file,deep+1);
            }else {
                for(int i=0;i<deep;i++) {
                    System.out.print("\t");
                }
                fileNums++;
                System.out.println("\t"+file);
            }
            
        }
    }

}

 统计已知类型的数量

package com.swift.Test;

import java.io.File;
import java.util.HashMap;
import java.util.Map;

/*已知一个文件夹路径,统计该文件夹(包含子文件夹)中每种类型的文件及个数
注意:用文件类型(后缀名,不包含.(点),如:"java","txt")作为key,
    用个数作为value,放入到map集合中,并用两种方式遍历map集合
    例如:
    doc 的类型的文件有  3 个
    java 的类型的文件有  5 个
    txt 的类型的文件有  7 个*/

//第一种情况统计指定类型文件的数量
public class Jinji1 {

    public static int docNums;
    public static int txtNums;
    public static int javaNums;

    public static void main(String[] args) {

        File dir = new File("c:/abc");
        getNums(dir);
        System.out.println("doc 的类型的文件有 "+docNums);
        System.out.println("java 的类型的文件有 "+javaNums);
        System.out.println("txt 的类型的文件有 "+txtNums);

    }

    private static void getNums(File dir) {
        File[] files = dir.listFiles();
        for (File file : files) {
            if (file.isDirectory()) {
                getNums(file);
            } else {
                if (file.getName().toLowerCase().endsWith("doc")) {
                    docNums++;
                } else if (file.getName().toLowerCase().endsWith("txt")) {
                    txtNums++;
                } else if (file.getName().substring(file.getName().lastIndexOf(".")+1).equals("java")) {
                    javaNums++;
                }
            }
        }
    }

}

统计未知类型的数量

package com.swift.Test;

import java.io.File;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

/*键盘录入一个文件夹路径,统计该文件夹(包含子文件夹)中每种类型的文件及个数
注意:用文件类型(后缀名,不包含.(点),如:"java","txt")作为key,
    用个数作为value,放入到map集合中,并用两种方式遍历map集合
    例如:
    doc 的类型的文件有  3 个
    java 的类型的文件有  5 个
    txt 的类型的文件有  7 个*/

//第二种情况统计未知类型文件的数量
public class FileNums {

    public static void main(String[] args) {
        
        File dir=inputDir();
        Map<String,Integer> map=new HashMap<>();
        getNums(dir,map);
        System.out.println(map);
    }

    private static void getNums(File dir,Map<String, Integer> map) {
        
        File[] files=dir.listFiles();
        for(File file:files) {
            if(file.isDirectory()) {
                getNums(file,map);
            }else {
                String name=file.getName();
                int n=name.lastIndexOf(".")+1;
                name=name.substring(n);
                if(!map.containsKey(name)) {
                    map.put(name, 1);
                }else {
                    map.put(name,map.get(name)+1);
                }
            }
        }
    }

    private static File inputDir() {
        
        Scanner scan = new Scanner(System.in);
        System.out.println("请输入一个目录");
        String dir=scan.nextLine();
        File dirF=new File(dir);
        if(!dirF.exists()) {
            throw new RuntimeException("这个目录不存在!");
        }
        if(!dirF.isDirectory())
            throw new RuntimeException("这不是一个目录!");
        return dirF;
    }

}

 层级练习

package com.swift.Test;

import java.io.File;
import java.util.Scanner;

/*从键盘接收一个文件夹路径,把文件夹中的所有文件以及文件夹的名字按层级打印
例如:
aaa是文件夹,里面有bbb.txt,ccc.txt,ddd.txt这些文件,有eee这样的文件夹,eee中有fff.txt和ggg.txt,打印出层级来
    aaa
        bbb.txt
        ccc.txt
        ddd.txt    
        eee
            fff.txt
            ggg.txt*/

public class PringFileCeng {

    public static void main(String[] args) {

        File dir=getDir();
        traverse(dir,0);
    }

    private static void traverse(File dir,int deep) {
        
        for(int i=0;i<deep;i++) {
            System.out.print("\t");
        }
        System.out.println(dir);
        File[] files=dir.listFiles();
        for(File file:files) {
            if(file.isDirectory()) {
                traverse(file,deep+1);
            }else {
                for(int i=0;i<deep;i++) {
                    System.out.print("\t");
                }
                System.out.println("\t"+file);
            }
        }
        
    }

    private static File getDir() {
        
        Scanner scan =new Scanner(System.in);
        System.out.println("请输入一个目录:");
        String str=scan.nextLine();
        File dirF=new File(str);
        if(!dirF.exists()) {
            throw new RuntimeException("这个目录不存在!");
        }
        if(!dirF.isDirectory()) {
            throw new RuntimeException("这不是一个目录!");
        }
        return dirF;
    }


}

 

posted @ 2018-03-04 11:30  Advancing-Swift  阅读(1852)  评论(0编辑  收藏  举报