File类

java.io.File

IO技术概述:

  • a: Output
    • 把内存中的数据存储到持久化设备上这个动作称为输出(写)Output操作(即从程序到文件,对程序来说是输出操作)。
  • b: Input
    • 把持久设备上的数据读取到内存中的这个动作称为输入(读)Input操作(即从文件到程序,对程序来说是输入操作)。
  • c: IO操作
    • 把上面的这种输入和输出动作称为IO操作。
      IO流是用来传输数据的。到底是输入还是输出,都是以Java程序为参照。

File类概述和作用:
将操作系统中的文件、目录(文件夹)、路径,封装成File对象。
提供方法,操作系统中的内容。
File是与系统无关的类,“/”UNIX、LINUX平台,“\\”windows平台。

File类静态成员变量:pathSeparator,separator

 public class FileDemo {
    public static void main(String[] args) {
        //File类静态成员变量
        //与系统有关的路径分隔符(final常量,但因操作系统而改变)
        String separator = File.pathSeparator;
        System.out.println(separator);// 是一个分号;目录的分割
        // (window中环境变量配置各个路径用分号分割,
        // 表示一个完整的路径结束)  Linux中是冒号 :
                    
        //与系统有关的默认名称分隔符
        separator = File.separator;
        System.out.println(separator);//目录名称分割  
        // window中:右划线 \    Linux中:左划线 / 
     }
}

File类构造函数(4种):
(1)File(File parent,String child)
parent:父抽象路径名 child:子路径名字符串

//将parent封装成file对象。
  File dir = new File("e:\\java_code\\day22e");
  File f3 = new File(dir,"hello.java");

异常:NullPointerException 如果child为null

(2)File(String pathname)
pathname:路径名字符串

 String pathName = "e:\\java_code\\day22e\\hello.java";
  File f1 = new File(pathName);

异常:NullPointerException 如果pathname为null

(3)File(String parent,String child)
parent:父路径名字符串 child:子路径名字符串

File f2 = new File("e:\\java_code\\day22e","hello.java");

异常:NullPointerException 如果child为null

(4)File(URI uri)
通过将给定的file: URI转换为抽象路径名来创建新的File实例

 File uri = new File(" D:/java/Demo.txt ");
 File file = new File(uri.toURI());

异常:NullPointerException 如果 uri是 null
IllegalArgumentException 如果参数的前提条件不成立

File类的获取(部分):

String getAbsolutePath() 返回绝对路径名字符串
File getAbsoluteFile() 同上,返回值不同,eclipse环境中,写的是一个相对路径,返 回绝对位置工程根目录
String getPath() 返回路径名字符串,等同于toString方法
long length() 返回文件的长度
String getParent() 返回父目录的路径名字符串
File getParentFile() 返回父目录,当已无父目录时,返回null

File类的判断功能:

boolean exists() 判断File构造方法中封装路径是否存在
boolean isDirectory() 判断File构造方法中封装的路径是不是文件夹
boolean isFile() 判断File构造方法中封装的路径是不是文件

!要判断是否为文件夹或文件,先判断是否存在!

File类的创建和删除功能:
(1)boolean createNewFile()

/**
*File创建文件的功能
*创建的文件的路径和名称,在File的构造方法中给出
*若文件已经存在,不再创建,返回flase
*该方法只能创建文件,不能创建文件夹
*/
public static void function() throws IOException{
    File file = new File("C:\\a.txt");
    boolean b = file.createNewFile();
   System.out.println(b);
}

(2)boolean delete()

/**
*File类 删除文件或目录的功能
*删除的文件或目录,在File构造方法中给出
*文件打开状态时,删除失败
*删除方法不走回收站,直接从硬盘删除
*删除有风险,运行需谨慎
*/
public static void function() throws IOException{
    File file = new File("C:\\a.txt");
    boolean b = file.delete();
    System.out.println(b);
}

(3)boolean mkdir(),boolean mkdirs()

/**
*File类 创建文件夹的功能
*mkdirs创建多层文件夹,mkdir创建单层文件夹
*创建的路径也在构造方法中给出
*若文件夹已经存在,不再创建
*/
public static void function() throws IOException{
    File file = new File("C:\\abc");
    boolean b = file.mkdir();
   System.out.println(b);  // b 为 true
  
    File file_1 = new File("C:\\abc\\ab\\a");
    boolean b = file.mkdirs();  
    
}

File类的list获取功能:
(1)String[] list()
获取路径中的文件和文件夹名(相当于遍历一个目录),返回的只有名字
(2)File[] listFile()
获取路径中的文件和文件夹名(相当于遍历一个目录),返回文件或文件夹的全路径

public static void function(){
    File file = new File("C:");  // 隐藏受保护的文件和文件夹也会打印出来
    File fileArr = file.listFile();
    for(File f : fileArr){
        System.out.println(f);
    }
}

文件过滤器:
作用:过滤一个目录下的指定扩展名的文件,或者包含某些关键字的文件夹
方法:

  • public String[] list(FilenameFilter filter)
  • public File[] listFiles(FileFilter filter) 传入实现了FileFilter接口的类对象

FileFilter接口,需重写的抽象方法:boolean accept(File pathname)
FilenameFilter接口,需要重写的方法:boolean accept(File dir,String name)
(dir:父目录路径,name:文件或文件夹名称)

/*
*  自定义过滤器
*  实现FileFilter接口,重写抽象方法
*/
public class MyFilter implements FileFilter{
    public boolean accept(File pathname)  {
       /*
       * pathname 接受到的也是文件的全路径
       * c:\\demo\\1.txt
      * 对路径进行判断,如果是java文件,返回true,不是java文件,返回false
      * 文件的后缀结尾是.java
      */          
       return pathname.getName().endsWith(".java");     
     }
}
            
/*
*  File类的获取,文件获取过滤器
*  遍历目录的时候,可以根据需要,只获取满足条件的文件
*  遍历目录方法 listFiles()重载形式
*  listFiles(FileFilter filter)接口类型
*  传递FileFilter接口的实现类
*  自定义FileFilter接口实现类,重写抽象方法,
*  接口实现类对象传递到遍历方法listFiles
*/
public class FileDemo1 {
    public static void main(String[] args) {
       File file = new File("c:\\demo");
       File[] fileArr = file.listFiles(new MyFilter());
       for(File f : fileArr){
           System.out.println(f);
       }
     }
}

文件过滤器实现原理
File类递归遍历全目录
直接递归:方法自己调用自己,适用于,方法中运算的主体不变,但是运行的时候,参与运算的方法参数会变化。
要求:对一个目录的下的所有内容,进行完全的遍历,若指定的目录有子目录,那么把子目录中的文件路径也打印出来
步骤:

  1. 指定要打印的目录File对象
  2. 调用getFileAll()方法
    2.1 获取指定目录中的所有File对象
    2.2 遍历得到每一个File对象
    2.3 判断当前File 对象是否是目录
    判断结果为true,说明为目录,通过递归,再次调用步骤2的getFileAll()方法
    判断结果为false,说明是文件,打印文件的路径
public class FileDemo2 {
    public static void main(String[] args) {
        File file = new File("d:\\test");
        getFileAll(file);
    }
    //获取指定目录以及子目录中的所有的文件
    public static void getFileAll(File file) {
        File[] files = file.listFiles();
        //遍历当前目录下的所有文件和文件夹
        for (File f : files) {
           //判断当前遍历到的是否为目录
           if(f.isDirectory()){
               //是目录,继续获取这个目录下的所有文件和文件夹
               getFileAll(f);
           }else{
               //不是目录,说明当前f就是文件,那么就打印出来
               System.out.println(f);
           }
        }
    }
}

!!!递归一定要有出口, 必须可以让程序停下!递归次数不能过多!构造方法,禁止递归!

递归遍历出指定后缀名的文件:

public class MyJavaFilter implements FileFilter {
   public boolean accept(File pathname) {
      //判断获取的是目录,直接返回true
      if(pathname.isDirectory())
           return true;
           return pathname.getName().toLowerCase().endsWith(".java");
       }

    }
/*
*  遍历目录,获取目录下的所有.java文件
*  遍历多级目录,方法递归实现
*  遍历的过程中,使用过滤器
*/
public class FileDemo1 {
   public static void main(String[] args) {
      getAllJava(new File("c:\\demo"));
      //        new File("c:\\demo").delete();
   }
/*
* 定义方法,实现遍历指定目录
* 获取目录中所有的.java文件
*/
public static void getAllJava(File dir){
   //调用File对象方法listFiles()获取,加入过滤器
   File[] fileArr = dir.listFiles(new MyJavaFilter());
   for(File f : fileArr){
        //对f路径,判断是不是文件夹
        if(f.isDirectory()){
            //递归进入文件夹遍历
            getAllJava(f);
        }else{
            System.out.println(f);
          }
        }
    }
}