欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

(七)、Java复习笔记之 I/O 流(1)

程序员文章站 2024-03-03 20:22:40
...

I/O流体系图:

(七)、Java复习笔记之 I/O 流(1)

79、File类

  • 概述
    • 文件和目录路径名的抽象表示形式
    • File更应该叫做一个路径
      • 文件路径或者文件夹路径
      • 路径分为绝对路径和相对路径
      • 绝对路径是一个固定的路径,从盘符开始
      • 相对路径相对于某个位置,在eclipse下是指当前项目下,在dos下指的是当前路径
  • 构造方法

    • File(String pathname):根据一个路径得到File对象
    • File(String parent, String child):根据一个目录和一个子文件/目录得到File对象
    • File(File parent, String child):根据一个父File对象和一个子文件/目录得到File对象

      File file = new File("F:\\Java笔记\\video\\今日内容.avi"); //第一个\是转义
      
      String parent = "F:\\Java笔记\\video";
      String child = "今日内容.avi";
      File file = new File(parent,child);
      
      File parent = new File("F:\\Java笔记\\video");
      String child = "今日内容.avi";
      File file = new File(parent, child);
      

80、File类的创建功能

  • 创建功能

    • public boolean createNewFile():创建文件 如果存在这样的文件,就不创建了
    • public boolean mkdir():创建文件夹 如果存在这样的文件夹,就不创建了
    • public boolean mkdirs():创建文件夹,如果父文件夹不存在,会帮你创建出来(级联创建)

      File file = new File("yyy.txt");
      file.createNewFile();
      
      File dir1 = new File("aaa");
      dir1.mkdir()
      
      File dir3 = new File("ccc\\ddd");
      dir3.mkdirs()
      
  • 注意事项:
    • 如果你创建文件或者文件夹忘了写盘符路径,那么,默认在项目路径下。

81、File类的重命名和删除功能

  • 重命名和删除功能
    • public boolean renameTo(File dest):把文件重命名为指定的文件路径
    • public boolean delete():删除文件或者文件夹
  • 重命名注意事项
    • 如果路径名相同,就是改名。
    • 如果路径名不同,就是改名并剪切。
  • 删除注意事项:

    • Java中的删除不走回收站。
    • 要删除一个文件夹,请注意该文件夹内不能包含文件或者文件夹

      File file1 = new File("ooo.txt");
      File file2 = new File("D:\\xxx.txt");
      System.out.println(file1.renameTo(file2));
      
      File file1 = new File("yyy.txt");
      System.out.println(file1.delete());
      

82、File类的判断功能

  • 判断功能
    • public boolean isDirectory():判断是否是目录
    • public boolean isFile():判断是否是文件
    • public boolean exists():判断是否存在
    • public boolean canRead():判断是否可读
    • public boolean canWrite():判断是否可写
    • public boolean isHidden():判断是否隐藏
  • 实例

    File file = new File("zzz");
    file.setReadable(false);
    System.out.println(file.canRead()); //true,windows系统认为所有的文件都是可读的
    file.setWritable(false);
    System.out.println(file.canWrite()); //false,windows系统可以设置为不可写  
    

83、File类的获取功能

  • 获取功能
    • public String getAbsolutePath():获取绝对路径
    • public String getPath():获取路径(获取构造方法中传入路径)
    • public String getName():获取名称
    • public long length():获取长度。字节数
    • public long lastModified():获取最后一次的修改时间,毫秒值
    • public String[] list():获取指定目录下的所有文件或者文件夹的名称数组
    • public File[] listFiles():获取指定目录下的所有文件或者文件夹的File数组
  • 实例:判断E盘目录下是否有后缀名为.jpg的文件,如果有,就输出该文件名称

    File dir = new File("E:\\");
    
    String[] arr = dir.list();  //获取e盘下所有的文件或文件夹
    for (String string : arr) {
        if(string.endsWith(".jpg")) {
            System.out.println(string);
        }
    }
    
    // 或者
    
    File[] subFiles = dir.listFiles();  //获取e盘下所有的文件或文件夹对象
    for (File subFile : subFiles) {
        if(subFile.isFile() && subFile.getName().endsWith(".jpg")) {
            System.out.println(subFile);
        }
    }   
    

84、文件名称过滤器

  • 概述
    • public String[] list(FilenameFilter filter):获取满足指定过滤器的文件和目录。
    • public File[] listFiles(FileFilter filter)
  • 实例:判断E盘目录下是否有后缀名为.jpg的文件,如果有,就输出该文件名称

    File dir = new File("E:\\");
    String[] arr = dir.list(new FilenameFilter() {
    
        @Override
        public boolean accept(File dir, String name) {
            //System.out.println(dir); //E:\
            //System.out.println(name); //E盘里的文件名或文件夹名
            File file = new File(dir, name);
            return file.isFile() && file.getName().endsWith(".jpg");
        }
    });
    
    for (String str : arr) {
        System.out.println(str);
    }
    

85、File实例

  • 从键盘接收一个文件夹路径,统计该文件夹大小

    public static void main(String[] args) {
        //File dir = new File("F:\\day06");
        //System.out.println(dir.length()); //直接获取文件夹的结果是0
        File dir = getDir();
        System.out.println(getFileLength(dir));
    }
    
    //从键盘接收一个文件夹路径
    public static File getDir() {
        //1,创建键盘录入对象
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入一个文件夹路径:");
        //2,定义一个无限循环
        while(true) {
            //3,将键盘录入的结果存储并封装成File对象
            String line = sc.nextLine();
            File dir = new File(line);
            //4,对File对象判断
            if(!dir.exists()) {
                System.out.println("您录入的文件夹路径不存在,请输入一个文件夹路径:");
            }else if(dir.isFile()) {
                System.out.println("您录入的是文件路径,请输入一个文件夹路径:");
            }else {
                //5,将文件夹路径对象返回
                return dir;
            }
        }
    }
    
    //统计该文件夹大小
    public static long getFileLength(File dir) {    
        //1,定义一个求和变量
        long len = 0;
        //2,获取该文件夹下所有的文件和文件夹listFiles();
        File[] subFiles = dir.listFiles();          
        //3,遍历数组
        for (File subFile : subFiles) {
            //4,判断是文件就计算大小并累加
            if(subFile.isFile()) {
                len = len + subFile.length();
            //5,判断是文件夹,递归调用
            }else {
                len = len + getFileLength(subFile);
            }
        }
        return len;
    }
    
  • 从键盘接收一个文件夹路径,删除该文件夹

    public static void main(String[] args) {
        File dir = Test1.getDir(); //获取文件夹路径
        deleteFile(dir);
    }
    
    //从键盘接收一个文件夹路径
    public static File getDir() {
        //1,创建键盘录入对象
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入一个文件夹路径:");
        //2,定义一个无限循环
        while(true) {
            //3,将键盘录入的结果存储并封装成File对象
            String line = sc.nextLine();
            File dir = new File(line);
            //4,对File对象判断
            if(!dir.exists()) {
                System.out.println("您录入的文件夹路径不存在,请输入一个文件夹路径:");
            }else if(dir.isFile()) {
                System.out.println("您录入的是文件路径,请输入一个文件夹路径:");
            }else {
                //5,将文件夹路径对象返回
                return dir;
            }
        }
    }
    
    //删除该文件夹
    public static void deleteFile(File dir) {   
        //1,获取该文件夹下的所有的文件和文件夹
        File[] subFiles = dir.listFiles();      
        //2,遍历数组
        for (File subFile : subFiles) {
            //3,判断是文件直接删除
            if(subFile.isFile()) {
                subFile.delete();
            //4,如果是文件夹,递归调用
            }else {
                deleteFile(subFile);            
            }
        }
        //5,循环结束后,把空文件夹删掉
        dir.delete();
    }
    
  • 从键盘接收两个文件夹路径,把其中一个文件夹中(包含内容)拷贝到另一个文件夹中

    public static void main(String[] args) throws IOException {
        File src = Test1.getDir();
        File dest = Test1.getDir();
        if(src.equals(dest)) {
            System.out.println("目标文件夹是源文件夹的子文件夹");
        }else {
            copy(src,dest);
        }
    }
    
    //从键盘接收一个文件夹路径
    public static File getDir() {
        //1,创建键盘录入对象
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入一个文件夹路径:");
        //2,定义一个无限循环
        while(true) {
            //3,将键盘录入的结果存储并封装成File对象
            String line = sc.nextLine();
            File dir = new File(line);
            //4,对File对象判断
            if(!dir.exists()) {
                System.out.println("您录入的文件夹路径不存在,请输入一个文件夹路径:");
            }else if(dir.isFile()) {
                System.out.println("您录入的是文件路径,请输入一个文件夹路径:");
            }else {
                //5,将文件夹路径对象返回
                return dir;
            }
        }
    }
    
    //把其中一个文件夹中(包含内容)拷贝到另一个文件夹中 
    public static void copy(File src, File dest) throws IOException {
        //1,在目标文件夹中创建原文件夹
        File newDir = new File(dest, src.getName());
        newDir.mkdir();
        //2,获取原文件夹中所有的文件和文件夹,存储在File数组中
        File[] subFiles = src.listFiles();
        //3,遍历数组
        for (File subFile : subFiles) {
            //4,如果是文件就用io流读写
            if(subFile.isFile()) {
                BufferedInputStream bis = new BufferedInputStream(new FileInputStream(subFile));
                BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(new File(newDir,subFile.getName())));
    
                int b;
                while((b = bis.read()) != -1) {
                    bos.write(b);
                }
    
                bis.close();
                bos.close();
            //5,如果是文件夹就递归调用
            }else {
                copy(subFile,newDir);
            }
        }
    }
    
  • 从键盘接收一个文件夹路径,把文件夹中的所有文件以及文件夹的名字按层级打印, 例如:
    aaa是文件夹,里面有bbb.txt,ccc.txt,ddd.txt这些文件,有eee这样的文件夹,eee中有fff.txt和ggg.txt,打印出层级来
    (七)、Java复习笔记之 I/O 流(1)
    *

    public static void main(String[] args) {
        File dir = Test1.getDir(); //获取文件夹路径
        printLev(dir,0);
    }
    
    //从键盘接收一个文件夹路径
    public static File getDir() {
        //1,创建键盘录入对象
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入一个文件夹路径:");
        //2,定义一个无限循环
        while(true) {
            //3,将键盘录入的结果存储并封装成File对象
            String line = sc.nextLine();
            File dir = new File(line);
            //4,对File对象判断
            if(!dir.exists()) {
                System.out.println("您录入的文件夹路径不存在,请输入一个文件夹路径:");
            }else if(dir.isFile()) {
                System.out.println("您录入的是文件路径,请输入一个文件夹路径:");
            }else {
                //5,将文件夹路径对象返回
                return dir;
            }
        }
    }
    
    //把文件夹中的所有文件以及文件夹的名字按层级打印
    public static void printLev(File dir,int lev) {
        File[] subFiles = dir.listFiles();
        //1,遍历数组
        for (File subFile : subFiles) {
            for(int i = 0; i <= lev; i++) {
                System.out.print("\t");
            }
            //2,无论是文件还是文件夹,都需要直接打印
            System.out.println(subFile);
            //3,如果是文件夹,递归调用
            if(subFile.isDirectory()) {
                //printLev(subFile,lev + 1);
                printLev(subFile,++lev);
            }
        }
    }
    
相关标签: IO流 java io