Java学习路程之file类

file类
1.file 是文件和目录路径名的抽象表示形式.可以表示文件名、文件夹、文件路径(可以是错误路径)。
2.路径分类
相对路径:这个文件所在的路径与其它文件路径之间的关系。
绝对路径:文件在硬盘上的真实位置

public class Day18 {
    public static void main(String[] args) {
        //分隔符
        String separator = File.separator;
        System.out.println(separator);//  /
        String pathseparator = File.pathSeparator;
        System.out.println(pathseparator);// :

        //File类构造方法
        File file = new File("src/hello.txt");//相对路径
        //判断该路径是否存在
        boolean b = file.exists();
        System.out.println(b);//true
        //获取绝对路径的方法
        String absolutePath = file.getAbsolutePath();
        System.out.println(absolutePath);///Users/lanou/Documents/SHJ180804/blog/src/hello.txt
        //获取传入的路径
        String path = file.getPath();
        System.out.println(path);//src/hello.txt
        //获取文件夹大小(字节)
        long length = file.length();
        //判断一个路径是不是文件
        boolean b2 = file.isFile();
        System.out.println(b2);//true
        //判断一个路径是文件夹
        boolean b3 = file.isDirectory();
        System.out.println(b3);//false
    }
}
//创建方法
public static void main(String[] args) throws IOException {
        //创建方法
        //创建单个文件方法,在路径的文件夹后写明要创建的文件夹
        //传入的路径可能是错误的所以要抛出异常
        File file = new File("/Users/lanou/Desktop/test/hello.txt");
        boolean createNewFile = file.createNewFile();
        System.out.println(createNewFile);//true
        //创建单个文件夹方法
        File file1 = new File("/Users/lanou/Desktop/test/h");
        boolean mkdir = file1.mkdir();
        System.out.println(mkdir);//true
        //创建多层级文件夹方法(也可创建单层级文件夹)
        File file2 = new File("/Users/lanou/Desktop/test/h");
        boolean mkdirs = file1.mkdirs();
        System.out.println(mkdirs);//true
    }
    //删除方法
    public static void main(String[] args) throws IOException {
        //删除方法(可以删除文件和空的文件夹)
        File file = new File("/Users/lanou/Desktop/test/hello.txt");
        boolean delete = file.delete();
        //删除了hello.txt文件
        System.out.println(delete);//true
    }
    public static void main(String[] args) throws IOException {
        //list()获取文件夹下所有文件(一级目录)
        File file = new File("/Users/lanou/Desktop/test");
        //获取最后一个文件或文件夹名
        String name = file.getName();
        String[] strings = file.list();
        //listFiles()以文件类型返回的
        File[] files = file.listFiles();
        for (File file2 : files) {
            System.out.println(file2);
        }
    }

练习1:
封装一个方法 传入一个文件夹路径,打印该文件夹下 所有文件

public void printFiles(File file) {
        File[] listFiles = file.listFiles();
        for (File subFile : listFiles) {
            //判断是不是文件
            if (subFile.isFile()) {
                //是文件直接打印
                System.out.println(file);
            }else {
                //不是文件继续遍历
                printFiles(subFile);
            }
        }
    }

练习2:
//分装方法通过文件夹路径删除文件夹

public void deleteDir(File file) {
        File[] listFiles = file.listFiles();
        for (File subFile : listFiles) {
            if (subFile.isFile()) {
                //是文件直接删除
                subFile.delete();
            }else {
                //不是文件继续遍历
                deleteDir(subFile);
            }
        }
        //删除空文件夹
        file.delete();
    }

练习3:
从控制台输入一个字符串
1.判断该字符串是文件夹路径,返回文件夹路径
2.计算这个文件夹的大小

//判断该字符串是文件夹路径 
public File isFilePath() {
         System.out.println("请输入字符串路径");
         Scanner scanner = new Scanner(System.in);
         while (true) {
             String string = scanner.nextLine();
             //创建文件对象
             File file = new File(string);
             if (file.exists()) {
                 //存在此路径
                if (file.isDirectory()) {
                    //是文件夹
                    return file;
                }else {
                    //不是文件夹
                    System.out.println("不是文件夹,请重试");
                }
            }else {
                //不存在此路径
                System.out.println("不存在此路径,请重试");
            }
        }
     }
    //接收路径计算文件夹大小
     public long getDirLength(File file) {
         long num = 0; //保存文件大小
         File[] listFiles = file.listFiles();
         for (File subFile : listFiles) {
            if (subFile.isDirectory()) {
                //是文件夹,遍历计算文件大小
                num = num + getDirLength(subFile);
            }else {
                //是文件计算大小
                num = num + subFile.length();
            }
        }
         return num;
     }

练习4:
输入一个文件夹路径 按层级关系 打印

public void printDirByLevel(File file, int level) {
        String string  = "";
        for (int i = 0; i < level; i++) {
            string = string + "\t";
        }
        File[] listFiles = file.listFiles();
        for (File subFile : listFiles) {
            //直接打印
            System.out.println(string + subFile);
            if (subFile.isDirectory()) {
                //是文件夹
                printDirByLevel(subFile, level + 1);
            }else {
                //是文件
                System.out.println(string + subFile.getName());
            }
        }
    }

练习5:
传入一个文件夹路径 用map记录类型出现的次数

public void getTypeNum(File file, HashMap<String, Integer> map) {
        File[] listFiles = file.listFiles();
        for (File subFile : listFiles) {
            if (subFile.isFile()) {
                //是文件
                //获取文件名
                String name = subFile.getName();
                //切割文件名
                String[] split = name.split("\\.");
                String key = split[1];
                if (map.containsKey(key)) {
                    //map中不存在key值
                    Integer value = map.get(key);
                    value++;
                    map.put(key, value);
                }else {
                    //map中存在key值
                    map.put(key, 1);
                }
            }else {
                //是文件夹
                getTypeNum(subFile, map);
            }
        }
    }

3.文件过滤器
1).FileFilter 接口

public class Day18 {
    public static void main(String[] args) {
        File file = new File("/Users/lanou/Desktop/test");
        File[] listFiles = file.listFiles(new MyFileFilter());
        for (File subFile : listFiles) {
            System.out.println(subFile);
        }
    }
}

//实现接口的过滤方法
class MyFileFilter implements FileFilter{
      返回false 数组中没有数据
      返回true 打印数组中的一级目录文件和文件夹(与不传参数一样)
      根据接口中这个方法的返回值:
      true 就会把该文件存入到listFiles这个数组中
      false 不会存入到listFiles数组中
     综上listFiles数组中保存什么完全根据这个方法的返回值来看
     参数pathname 一级目录下所有文件
    public boolean accept(File pathname) {
        //通过判断是否是文件和文件夹来过滤打印文件还是文件夹
        return pathname.isDirectory();
    }
}

2).FilenameFilter(接口) 过滤器

public class Day18 {
    public static void main(String[] args) {
        File file = new File("/Users/lanou/Desktop/test");
        File[] listFiles = file.listFiles(new MyFileNameFilter());
        System.out.println(listFiles);
    }
}
//创建MyFileNameFilter类实现FilenameFilter接口
class MyFileNameFilter implements FilenameFilter{ 
    @Override
    public boolean accept(File dir, String name) {
        //dir为文件的目录路径,name为文件的文件名
        System.out.println(dir + "  " + name);
        return false;
    }
}

猜你喜欢

转载自blog.csdn.net/l710820742/article/details/82667792