1.8 File类、递归

File类

概述

  • java.io.File类:文件和路径名的抽象表现形式
  • java把电脑中的文件和文件夹(目录)封装为了一个File类,可以使用File类对文件和文件夹进行操作
  • File类是一个与系统无关的类,任何的操作系统都可以使用这个类中的方法
  • file 文件 directory目录 path路径

file类中的静态成员变量

static String pathSeparator 
          与系统有关的路径分隔符,为了方便,它被表示为一个字符串。 
static char pathSeparatorChar 
          与系统有关的路径分隔符。 
static String separator 
          与系统有关的默认名称分隔符,为了方便,它被表示为一个字符串。 
static char separatorChar 
          与系统有关的默认名称分隔符。 
注意:操作路径不能写死
C:\develop\a.txt    windows
~/develop/a.txt     Linux
"C:"+File.separator+"develop"+File.separator+"a.txt"  Linux\Windows


String pathSeparator=File.pathSeparator;
System.out.println(pathSeparator);//路径分隔符 windows:分号  Linux:冒号
如:C:\a.txt;D:\b.txt 两个路径之间分开

String separator=File.separator;
System.out.println(separator);//文件名分隔符 windows:反斜杠\  Linux:正斜杠/

绝对路径和相对路径

  • 绝对路径:从盘符开始的路径,这是一个完整的路径。

C:\demo\a.txt

  • 相对路径:相对于当前目录的根目录

如果使用当前目录的根目录,可以简化书写
C:\java_project\a.txt -->简化为 a.txt

  • 注意:
  1. 路径不区分大小写
  2. 路径中的文件名称分隔符windows使用反斜杠,反斜杠是转义字符,两个反斜杠代表一个普通的反斜杠

File类构造方法

  • public File(String pathname) :通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。
  • public File(String parent, String child) :从父路径名字符串和子路径名字符串创建新的 File实例。
  • public File(File parent, String child) :从父抽象路径名和子路径名字符串创建新的 File实例。

注意:创建File对象,只是把字符串路径封装成file对象,不考虑路径的真假情况

File类中常用方法

获取功能的方法

  • public String getAbsolutePath() :返回此File的绝对路径名字符串。 (获取绝对路径)
  • public String getPath() :将此File转换为路径名字符串。(获取构造方法中传递的路径)
  • public String getName() :返回由此File表示的文件或目录的名称。 (获取构造方法传递路径的结尾部分)
  • public long length() :返回由此File表示的文件的长度。 (文件夹是没有大小的,不能获取文件夹的大小,返回0值)(如果构造方法中给出的路径不存在,返回0值)

判断功能的方法

  • public boolean exists() :此File表示的文件或目录是否实际存在。
  • public boolean isDirectory() :此File表示的是否为目录。
  • public boolean isFile() :此File表示的是否为文件。

创建删除功能的方法

  • public boolean createNewFile() :当且仅当具有该名称的文件尚不存在时,创建一个新的空文件。
    1. 此方法只能创建文件,不能创建文件夹
    2. 创建文件的路径必须存在,否则会抛出异常
  • public boolean delete() :删除由此File表示的文件或目录。
  • public boolean mkdir() :创建由此File表示的目录。 (创建单级文件夹)
  • public boolean mkdirs() :创建由此File表示的目录,包括任何必需但不存在的父目录。(既可创建单级文件夹,也可创建多级文件夹)
public class FileCreateDelete {     
   public static void main(String[] args) throws IOException {         
   // 文件的创建         
   File f = new File("aaa.txt");         
   System.out.println("是否存在:"+f.exists()); // false        
   System.out.println("是否创建:"+f.createNewFile()); // true         
   System.out.println("是否存在:"+f.exists()); // true                
   // 单级目录的创建            
   File f2= new File("newDir");                 
   System.out.println("是否存在:"+f2.exists());// false         
   System.out.println("是否创建:"+f2.mkdir()); // true           
   System.out.println("是否存在:"+f2.exists());// true   
   // 创建多级目录                 
   File f3= new File("newDira\\newDirb");            
   System.out.println(f3.mkdir());// false         
   File f4= new File("newDira\\ccc.txt");         
   System.out.println(f4.mkdirs());// true 不要被名称迷惑,看具体类型,ccc.txt是一个目录              
   // 文件的删除           
   System.out.println(f.delete());// true                 
   // 目录的删除            
   System.out.println(f2.delete());// true         
   System.out.println(f4.delete());// false     
   } 
   }

注意:delete方法,如果此File表示目录,则目录必须为空才能删除

目录的遍历

  • public String[] list() :返回一个String数组,表示该File目录中的所有子文件或目录。
  • public File[] listFiles() :返回一个File数组,表示该File目录中的所有的子文件或目录。

注意:

  1. list和listFiles方法遍历的是构造方法中给出的目录;
  2. 如果构造方法中给出的目录路径不存在,会抛出空指针异常;
  3. 如果构造方法中给出的路径不是一个目录,也会抛出空指针异常;

递归

  • 递归的分类: 递归分为两种,直接递归和间接递归。
    • 直接递归称为方法自身调用自己。
    • 间接递归可以A方法调用B方法,B方法调用C方法,C方法调用A方法。
  • 注意事项
    • 递归一定要有条件限定,保证递归能够停止下来,否则会发生栈内存溢出。
    • 在递归中虽然有限定条件,但是递归次数不能太多。否则也会发生栈内存溢出。
    • 构造方法,禁止递归
/*
需求:递归多级目录,查找.java文件
C:\abc
C:\abc\abc.txt
c:\abc\abc.java
c:\abc\a
c:\abc\a\a.java
c:\abc\a\a.jpg
c:\abc\b
c:\abc\b\b.java
c:\abc\b\b.jpg
*/
public class DiGuiMuLu {

    public static void main(String[] args) {
        File file=new File("c:\\abc");
        digui(file);

    }

    public static void digui(File file){
        File[] list=file.listFiles();
        if(list!=null){
            for (File s:list) {
                if(s.isFile()) {
                    //是文件判断文件名,输出java文件
                    if(s.getName().endsWith(".java")){
                        System.out.println(s);
                    }
                }else {
                    //是目录,则继续递归
                    digui(s);
                }
            }
        }

    }
}

文件过滤器

  • 在File类中有两个和ListFiles重载的方法,方法的参数传递就是过滤器
  • File[] listFiles(FileFilter filter)

1.java.io.FileFilter 是一个接口,是File的过滤器。
2.抽象方法:用来过滤文件的方法
boolean accept(File pathname) :测试pathname是否应该包含在当前File目录中,符合则返回true。
3.参数File pathname:使用ListFiles方法遍历目录,得到的每一个文件对象,pathname是文件或目录的绝对路径

  • File[] listFiles(FilenameFilter filter)
  1. java.io.FileNameFilter实现此接口的类实例可用于过滤器文件名
  2. 抽象方法:用来过滤文件的方法
    boolean accept(File dir, String name) :测试指定文件是否应该包含在某一文件列表中。
  3. File dir:构造方法中传递的被遍历的目录
    String name:使用ListFiles方法遍历目录,得到的每一个文件对象,name仅仅是文件或目录的名称,不是绝对路径
  • listFiles[]一共做了3件事情
  1. listfiles方法会对构造方法中传递的目录进行遍历,获取每一个文件/文件夹–>封装成File对象
  2. listfiles方法会调用参数的传递的过滤器中的方法accept
  3. listfiles方法会把遍历得到的每一个File对象,传递给accept方法的参数pathname
  • 过滤规则:
    在accept方法中返回的是一个布尔值
    true:把传递过去的File对象保存在File数组中
    false:不会把传递过去的File对象保存在File数组中
/*
   递归目录中的所有.java文件
*/
public class DiGuiDemo {
    public static void main(String[] args) {
        File file=new File("c:\\abc");
       digui(file);
    }

    public static void digui(File file){
      //使用FileFilter过滤器
        File[] files=file.listFiles(new FileFilter() {
            @Override
            public boolean accept(File pathname) {
                System.out.println(pathname);//c:\abc\a
                return pathname.getName().endsWith(".java")||pathname.isDirectory();//保存java文件和目录
            }
        });
     //使用FilenameFilter
        /*File[] files1=file.listFiles(new FilenameFilter() {
            @Override
            public boolean accept(File dir, String name) {
                //System.out.println(name);//a
                return (new File(dir,name)).isDirectory()||name.endsWith(".java");
            }
        });*/
        //使用Lambda表达式
         File[] files=file.listFiles(pathname->pathname.getName().endsWith(".java")||pathname.isDirectory());
         
         File[] files1=file.listFiles((dir,name)->(new File(dir,name)).isDirectory()||name.endsWith(".java"));
        //遍历子目录
        for (File f: files) {
            if(f.isFile()){
                System.out.println(f.getAbsoluteFile());
            }else{
                digui(f);
            }
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值