【JAVA基础】21 File类

1. File类的概述和构造方法

  • File类的概述

    • File更应该叫做一个路径

      • 文件路径或者文件夹路径

      • 路径分为绝对路径和相对路径

        • 绝对路径是一个固定的路径,从盘符开始

        • 相对路径相对于某个位置,在eclipse下是指当前项目下,在dos下

    • 查看API指的是当前路径

    • 文件和目录路径名的抽象表示形式

  • 构造方法

    • File(String pathname):根据一个路径得到File对象

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

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

  • 案例演示

    • File类的构造方法

    • package com.heima.file;
      
      import java.io.File;
      
      public class Demo1_File {
      
          /**
           * @param args
           */
          public static void main(String[] args) {
              File file1 = new File("D:\JAVA\01 JAVA基础\day19\day19\code\day19\src\com\heima\file\Demo1_File.java");
              System.out.println(file1.exists());
              
              File file2 = new File("xxx.txt");
              System.out.println(file2.exists());
              
              File Parent = new File("D:\JAVA\01 JAVA基础\day19\day19\code\day19\src\com\heima\file");
              String child = "Demo1_File.java";
              File file3 = new File(Parent, child);
              System.out.println(file3.exists());
              
              String parent = "D:\JAVA\01 JAVA基础\day19\day19\code\day19\src\com\heima\file";
              String child2 = "Demo1_File.java";
              File file4 = new File(Parent, child2);
              System.out.println(file4.exists());
          }
      
      }
      View Code

2. File类的创建功能

  • 创建功能

    • public boolean createNewFile():创建文件,如果存在这样的文件,就不创建了

    • public boolean mkdir():创建文件夹,如果存在这样的文件夹,就不创建了

    • public boolean mkdirs():创建文件夹,如果父文件夹不存在,会帮你创建出来

  • 案例演示

    • File类的创建功能

    • package com.heima.file;
      
      import java.io.File;
      import java.io.IOException;
      
      public class Demo2_File {
      
          /**
          public boolean createNewFile():创建文件,如果存在这样的文件,就不创建了
          public boolean mkdir():创建文件夹,如果存在这样的文件夹,就不创建了
          public boolean mkdirs():创建文件夹,如果父文件夹不存在,会帮你创建出来
           * @throws IOException 
           */
          public static void main(String[] args) throws IOException {
              File file1 = new File("test");
              System.out.println(file1.mkdir());
              
              File file2 = new File("test\a\b\c");
              System.out.println(file2.mkdirs());
              
              File file3 = new File("test\a\b\c\t1.txt");
              System.out.println(file3.createNewFile());  // 需要ctrl+1,throws IOException
          }
      
      }
      View Code
    • 注意事项:

      • 如果你创建文件或者文件夹忘了写盘符路径,那么,默认在项目路径下。

 

3. File类的重命名和删除功能

  • 重命名和删除功能

    • public boolean renameTo(File dest):把文件重命名为指定的文件路径

    • public boolean delete():删除文件或者文件夹

  • 重命名注意事项

    • 如果路径名相同,就是改名。

    • 如果路径名不同,就是改名并剪切。

  • 删除注意事项:

    • Java中的删除不走回收站。

    • 要删除一个文件夹,请注意该文件夹内不能包含文件或者文件夹

  • package com.heima.file;
    
    import java.io.File;
    import java.io.IOException;
    
    public class Demo3_File {
    
        /**
         重命名和删除功能
             public boolean renameTo(File dest):把文件重命名为指定的文件路径
             public boolean delete():删除文件或者文件夹
         * @throws IOException 
         */
        public static void main(String[] args) throws IOException {
    //        demo1(); 
            
            File file1 = new File("a/b/c/d");
            File file2 = new File("a/b/c/d/test.txt");
            if(!file1.exists()) {
                file1.mkdir();
            } 
            if (!file2.exists()) {
                file2.mkdirs();
            }
            System.out.println(file1.exists());
            System.out.println(file1.delete()); // Java中的删除不走回收站。
                        // 要删除一个文件夹,请注意该文件夹内不能包含文件或者文件夹
        }
    
        public static void demo1() throws IOException {
            File file1 = new File("xxx.txt");
            File file2 = new File("ooo.txt");
            if (!file1.exists()) {
                file1.createNewFile();
            } else {
                file1.delete();
                file1.createNewFile();
            }
            
            if (file2.exists() && file1.exists()) {
                file2.delete();
                System.out.println(file1.renameTo(file2));
            }
        }
    
    }
    View Code

 

4. File类的判断功能

  • 判断功能

    • public boolean isDirectory():判断是否是目录

    • public boolean isFile():判断是否是文件

    • public boolean exists():判断是否存在

    • public boolean canRead():判断是否可读

    • public boolean canWrite():判断是否可写

    • public boolean isHidden():判断是否隐藏

  • 案例演示

    • File类的判断功能

    • package com.heima.file;
      
      import java.io.File;
      
      public class Demo4_File {
      
          /**
          public boolean isDirectory():判断是否是目录
          public boolean isFile():判断是否是文件
          public boolean exists():判断是否存在
          public boolean canRead():判断是否可读
          public boolean canWrite():判断是否可写
          public boolean isHidden():判断是否隐藏
           */
          public static void main(String[] args) {
              File dir1 = new File("a");
              File file1 = new File("ooo.txt");
              System.out.println("查看文件file1和目录dir1是否是文件和目录");
              System.out.println(dir1.isDirectory());  // true
              System.out.println(file1.isFile());   // true
              
              System.out.println("查看文件file1是否可读可写");
              System.out.println(file1.canRead());   // true
              System.out.println(file1.canWrite());  // true
              
              System.out.println("设置文件file1和目录dir1是否可读可写");
              file1.setReadable(false);  //在windows系统中,认为所有文件都是可读的,所以设置无效
              System.out.println(file1.canRead()); // true
              file1.setWritable(false);  //在windows系统中,可以设置文件是否可写
              System.out.println(file1.canWrite()); // false
              dir1.setWritable(false);
              System.out.println(dir1.canWrite()); // true 
              
              System.out.println("查看目录是否可隐藏");
              System.out.println(dir1.isHidden()); //false
          }
      
      }
      View Code

5. File类的获取功能

  • 获取功能

    • public String getAbsolutePath():获取绝对路径

    • public String getPath():获取路径

    • public String getName():获取名称

    • public long length():获取长度。字节数

    • public long lastModified():获取最后一次的修改时间,毫秒值

    • public String[] list():获取指定目录下的所有文件或者文件夹的名称数组

    • public File[] listFiles():获取指定目录下的所有文件或者文件夹的File数组

  • 案例演示

    • File类的获取功能

    • package com.heima.file;
      
      import java.io.File;
      import java.io.IOException;
      import java.text.SimpleDateFormat;
      import java.util.Date;
      
      public class Demo5_File {
      
          /**
          public String getAbsolutePath():获取绝对路径
          public String getPath():获取路径
          public String getName():获取名称
          public long length():获取长度。字节数
          public long lastModified():获取最后一次的修改时间,毫秒值
          public String[] list():获取指定目录下的所有文件或者文件夹的名称数组
          public File[] listFiles():获取指定目录下的所有文件或者文件夹的File数组
           * @throws IOException 
           */
          public static void main(String[] args) throws IOException {
              File file1 = new File("a/b/c/test");
              file1.mkdirs();
              for (int i = 0; i < 10; i++) {
                  File file_i = new File("a/b/c/test/" + i);
                  file_i.createNewFile();
              }
              System.out.println("获取绝对路径:" + file1.getAbsolutePath()); // 获取绝对路径:D:JAVAcoursesday19ac	est
              System.out.println("获取路径:" + file1.getPath());  // 获取路径:ac	est
              System.out.println("获取名称:" + file1.getName());  // 获取名称:test
              System.out.println("获取长度,字节数:" + file1.length());  //获取长度,字节数:4096
              
              System.out.println("获取最后一次的修改时间,毫秒值:" + file1.lastModified()); // 获取最后一次的修改时间,毫秒值:1592288698496
              Date d = new Date(file1.lastModified()); 
              SimpleDateFormat sdf = new SimpleDateFormat("yyyy-mm-dd HH:MM:SS");
              System.out.println(sdf.format(d));  // 2020-24-16 14:06:496
              
              System.out.println("获取指定目录下的所有文件或者文件夹的名称数组:");
              String[] arr_s = file1.list();
              for (String s : arr_s) {
                  System.out.println(s); // 0 1 2 3 .. 9
              }
          
              
              System.out.println("获取指定目录下的所有文件或者文件夹的File数组:");
              File[] listFiles = file1.listFiles();
              for (File file : listFiles) {
                  System.out.println(file);
              }
              /*
                  ac	est
                  ac	est1
                  ac	est2
                  ac	est3
                  ac	est4
                  ac	est5
                  ac	est6
                  ac	est7
                  ac	est8
                  ac	est9
               */
          }
      
      }
      View Code

6. 输出指定目录下指定后缀的文件名

  • 案例演示

    • 需求:判断E盘目录下是否有后缀名为.jpg的文件,如果有,就输出该文件名称

    • package com.heima.file;
      
      import java.io.File;
      
      public class Demo6_File {
      
          /**
           需求:判断E盘目录下是否有后缀名为.jpg的文件,如果有,就输出该文件名称
           */
          public static void main(String[] args) {
      //        demo1();
              
              File dir = new File("E:\");
              File[] subfiles = dir.listFiles(); // 获取E盘下所有的文件或文件夹对象
              for (File file : subfiles) {
                  if(file.isFile() && file.getName().endsWith(".jpg")) {
                      System.out.println(file);
                  } 
              }
          }
      
          public static void demo1() {
              File dir = new File("E:\");
              String[] arr = dir.list(); // 获取E盘下的所有文件和文件夹
              for (String string : arr) {
                  if(string.endsWith(".jpg")) {
                      System.out.println(string);
                  } 
              }
          }
      
      }
      View Code

        

7. 文件名称过滤器的概述及使用

  • 文件名称过滤器的概述

    • public String[] list(FilenameFilter filter)

    • public File[] listFiles(FileFilter filter)

  • 文件名称过滤器的使用

    • 需求:判断E盘目录下是否有后缀名为.jpg的文件,如果有,就输出该文件名称

    • package com.heima.file;
      
      import java.io.File;
      import java.io.FilenameFilter;
      
      public class Demo6_File {
      
          /**
           需求:判断E盘目录下是否有后缀名为.jpg的文件,如果有,就输出该文件名称
           */
          public static void main(String[] args) {
              File dir = new File("E:\");
              
              String[] arr = dir.list(new FilenameFilter() {
                  
                  @Override
                  public boolean accept(File dir, String name) {
                      File file = new File(dir,name);
                      return file.isFile() && file.getName().endsWith(".jpg");
                  }
              });
              
              for (String string : arr) {
                  System.out.println(string);
              }
          }
      
      }
      View Code
  • 源码分析

    • 带文件名称过滤器的list()方法的源码

    •  public String[] list(FilenameFilter filter) {
              String names[] = list();   // 获取文件名称数组
              if ((names == null) || (filter == null)) {
                  return names;    // 判断null值情况
              }
              List<String> v = new ArrayList<>();   // 生成ArrayList数组列表,用于存储符合文件过滤器条件的文件名名称
              for (int i = 0 ; i < names.length ; i++) {
                  if (filter.accept(this, names[i])) {  // 调用文件过滤器的accept的方法
                      v.add(names[i]);
                  }
              }
              return v.toArray(new String[v.size()]); // 将输出结果转换为数组
          }
      View Code

8. File类(递归)

递归,就是方法自己调用自己。

  • 5的阶乘

    • package com.heima.test;
      
      public class Test4 {
      
          /**
          5的阶乘 1 * 2 * 3 * 4 * 5
          分析:
           5! = 5 * (4!)
              = 5 * 4 * (3!)
              = 5 * 4 * 3 * (2!)
              = 5 * 4 * 3 * 2 * (1!)
           */
          public static void main(String[] args) {
              int res = fun(5);
              System.out.println(res);
          }
          
          public static int fun(int num) {
              if(num == 1) {
                  return num;
              } else {
                  return num * fun(num - 1);
              }
          }
      }
      View Code
    • 所有方法都在栈内,直到fun(1)执行完,开始逐步弹栈。
    • 递归的缺点:如果调用的次数过多,容易出现栈内存溢出
    • 递归的优点:不用知道循环的次数
    • 问题:构造方法是否可以递归调用?
      • 不能
    • 问题:递归调用是否必须有返回值?
      • 不一定,可以有,也可以没有
      • 如:一个给定文件夹路径下的所有的.java文件名
  • 需求:从键盘输入接收一个文件夹路径,打印出该文件夹下所有的.java文件名

    • package com.heima.test;
      
      import java.io.File;
      import java.util.Scanner;
      
      public class Test5 {
      
          /**
           需求:
               从键盘输入接收一个文件夹路径,打印出该文件夹下所有的.java文件名
           */
          public static void main(String[] args) {
              // 1. 创建键盘录入对象,对路径进行判断,是否为文件夹,文件,是否存在
              File dir = getDir();
              
              
              // 2. 获取所有该文件夹下的所有.java的文件名
              // 获取到该文件夹路径下的所有的文件和文件夹,存储在File数组中
              // 遍历数组,对每一个文件或文件夹做判断
              //                     如果是文件,并且后缀是".java"的就打印输出;
              //                  如果是文件夹,就递归调用。
              printJavaFile(dir);
          }
          
          public static File getDir() {
              Scanner sc = new Scanner(System.in);
              System.out.println("请输入目标文件夹:");
              while(true) {
                  String line = sc.nextLine();
                  File dir = new File(line);
                  if(!dir.exists()) {
                      System.out.println("您录入的文件夹路径不存在,请重新录入:");
                  } else if(dir.isFile()) {
                      System.out.println("您录入的是文件路径,请重新录入文件夹路径:");
                  } else {
                      return dir;
                  }
              }
          }
          
          public static void printJavaFile(File dir) {
              // 获取到该文件夹路径下的所有的文件和文件夹,存储在File数组中
              File[] subFiles = dir.listFiles();
              for (File subFile : subFiles) {
                  if(subFile.isFile() && subFile.getName().endsWith(".java")){
                      System.out.println(subFile);
                  } else if (subFile.isDirectory()){
                      printJavaFile(subFile);
                  }
              }
          }
      }
      View Code

 

原文地址:https://www.cnblogs.com/zoe233/p/13036452.html