Java IO---File类

一.概述

java.io.File类是文件和目录路径名的抽象表示形式,主要用于文件和目录的创建,查找,删除,判断等操作。

二.构造方法

File类常用的构造方法有以下几个:

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

使用举例:

import java.io.File;

public class TestFile {
    public static void main(String[] args) {
    
        // public File(File parent, String child):
        // 根据 parent 抽象路径名和 child 路径名字符串创建一个新 `File` 实例。
        File parent = new File("D:\\abc");
        String child = "a.txt";
        File f1 = new File(parent, child);

        // public File(String pathname):
        // 通过将给定路径名字字符串转换为抽象路径名来创建一个新File实例。
        String pathname = "D:\\abc\b.txt";
        File f2 = new File(pathname);

        // public File(String parent, String child):
        // 根据parent路径字符串和child路径名字符串创建一个新File实例。
        String p = "D:\\abc";
        String c = "c.txt";
        File f3 = new File(p, c);
    }
}

注意:

无论指定路径下的文件或者目录是否存在,都不会影响File对象的创建。

三. 常用方法

  1. 获取功能的方法

    • public String getAbsolutePath():返回File的绝对路径名字符串。
    • public String getPath():将File转换为一个路径名字符串。
    • public String getName():返回由此File表示的文件或目录的名称。
    • public long length():返回File表示的文件的长度。
    import java.io.File;
    
    public class TestFile {
        public static void main(String[] args) {
        
            File f = new File("D:\\abc\\test.txt");
    
            System.out.println("文件绝对路径是:" + f.getAbsolutePath());
            System.out.println("文件路径是:" + f.getPath());
            System.out.println("文件名称是:" + f.getName());
            System.out.println("文件长度是:" + f.length());
            
            System.out.println("--------------------------------");
            
            File f1 = new File("D:\\abc");
            System.out.println("目录绝对路径是:" + f1.getAbsolutePath());
            System.out.println("目录路径是:" + f1.getPath());
            System.out.println("目录名称是:" + f1.getName());
            System.out.println("目录长度是:" + f1.length());
        }
    }
    

    输出信息:

    $ java TestFile
    文件绝对路径是:D:\abc\test.txt
    文件路径是:D:\abc\test.txt
    文件名称是:test.txt
    文件长度是:425
    --------------------------------
    目录绝对路径是:D:\abc
    目录路径是:D:\abc
    目录名称是:abc
    目录长度是:0
    
    

    注意:

    1. length()是获取文件的长度,对于目录,是没有长度概念的。

    2. 绝对路径是指从盘符开始的,一个完整的路径。

    3. 相对路径是指相对于当前目录的路径。

    4. 对于路径字符串中的分隔符,不同系统有不同的表达方式,比如windows是\,Linux是/,为了跨平台,可以使用File.separator来表示,它会根据系统使用对应的分隔符。

      比如:D:\abc, 可以使用"D:" + File.separator + "abc"

  2. 判断相关的方法

    • public boolean exists():测试File表示的文件或目录是否存在
    • public boolean isDirectory():测试File表示的文件是否是一个目录
    • public boolean isFile():测试File表示的文件是否是一个标准文件
    import java.io.File;
    
    public class TestFile {
        public static void main(String[] args) {
        
            File f = new File("D:\\abc\\test.txt");
            File f1 = new File("D:\\abc");
    
            // 判断是否存在
            System.out.println("D:\\abc\\test.txt是否存在? ==> " + f.exists());
            System.out.println("D:\\abc是否存在? ==> " + f1.exists());
    
            // 判断是否是文件
            System.out.println("D:\\abc\\test.txt是文件? ==> " + f.isFile());
            System.out.println("D:\\abc是文件? ==> " + f1.isFile());
    
            // 判断是否是目录
            System.out.println("D:\\abc\\test.txt是目录? ==> " + f.isDirectory());
            System.out.println("D:\\abc是目录? ==> " + f1.isDirectory());
        }
    }
    

    输出信息:

    $ java TestFile
    D:\abc\test.txt是否存在? ==> true
    D:\abc是否存在? ==> true
    D:\abc\test.txt是文件? ==> true
    D:\abc是文件? ==> false
    D:\abc\test.txt是目录? ==> false
    D:\abc是目录? ==> true
    
  3. 新建和删除功能

    • public boolean createNewFile():当且仅当不存在File指定名称的文件时,创建一个新的空文件。
    • public boolean delete():删除此File表示的文件或目录。
    • public boolean mkdir():创建此File指定的目录。
    • public boolean mkdirs():创建此File指定的目录,包括所有必需但不存在的父目录。
    import java.io.File;
    import java.io.IOException;
    
    public class TestFile {
        public static void main(String[] args) throws IOException{
            // 创建文件
            File newFile = new File("newFile.txt");
            System.out.println("newFile.txt存在? ==> " + newFile.exists());
            System.out.println("创建newFile.txt是否成功? ==> " + newFile.createNewFile());
            System.out.println("newFile.txt存在? ==> " + newFile.exists());
            System.out.println("=====================\r\n");
    
            // 创建单级目录
            File newDir = new File("newDir");
            System.out.println("newDir存在? ==> " + newDir.exists());
            System.out.println("创建newDir是否成功? ==> " + newDir.mkdir());
            System.out.println("newDir存在? ==> " + newDir.exists());
            System.out.println("=====================\r\n");
    
            // 创建多级目录
            File newDirs = new File("newDirs\\aaa");
            System.out.println("newDirs\\aaa存在? ==> " + newDirs.exists());
            System.out.println("创建newDirs\\aaa是否成功? ==> " + newDirs.mkdirs());
            System.out.println("newDirs\\aaa存在? ==> " + newDirs.exists());
    
            // 删除文件
            System.out.println("删除文件: " + newFile.delete());
    
            // 删除目录
            System.out.println("删除目录: " + newDir.delete());
            System.out.println("删除不为空的目录: " + newDirs.delete());
        }
    }
    

    输出信息:

    $ java TestFile
    newFile.txt存在? ==> false
    创建newFile.txt是否成功? ==> true
    newFile.txt存在? ==> true
    =====================
    
    newDir存在? ==> false
    创建newDir是否成功? ==> true
    newDir存在? ==> true
    =====================
    
    newDirs\aaa存在? ==> true
    创建newDirs\aaa是否成功? ==> false
    newDirs\aaa存在? ==> true
    删除文件: true
    删除目录: true
    删除不为空的目录: true
    

    注意:

    1. 删除多级目录时候,不会整个目录级删除,只会删除最内层的非空目录。
    2. 目录非空时,无法被删除。
  4. 遍历目录方法

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

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

    比如当前目录下有一文件夹Dir,里面有文件a.txt,b.txt,d.txt,以及文件夹c

    import java.io.File;
    import java.io.IOException;
    
    public class TestFile {
        public static void main(String[] args) throws IOException{
            // 当前路径下的Dir目录
            File f = new File("Dir");
    
            // public String[] list()
            String[] names;
            names = f.list();
    
            // 遍历files
            for (String name : names) {
                System.out.println(name);
            }
        }
    }
    // 输出信息
    a.txt
    b.txt
    c
    d.txt
    
    import java.io.File;
    import java.io.IOException;
    
    public class TestFile {
        public static void main(String[] args) throws IOException{
            // 当前路径下的Dir目录
            File dir = new File("Dir");
    
            // public File[] listFiles()
            File[] files;
            files = dir.listFiles();
    
            for (File f : files) {
                System.out.println(f.getName());
            }
        }
    }
    // 输出信息
    a.txt
    b.txt
    c
    d.txt
    

    注意:

    ​ 使用listFiles方法的File对象,其所表示的目录必须是实际存在的,否则无法遍历,报NullPointerException异常。

  5. 带过滤器的遍历目录方法

    • File[] listFiles(FileFilter filter):返回抽象路径名数组,这些路径名表示此File表示的目录中满足指定过滤器的文件和目录。

    说明:

    java.io.FileFilter是一个接口,是File的过滤器,该接口的对象可以传递给File类的listFiles(FileFilter)作为参数。

    ​ 接口中只有一个方法:boolean accept(File pathname):测试指定pathname是否应该包含在当前File目录中,符合就返回true。

    ​ 通过过滤器的作用,listFiles()返回的数组元素中,子文件对象都是符合过滤条件的。

    举例:查找目录Dir下,以.java结尾的文件,打印文件名字

    目录如下图:

    在这里插入图片描述

    import java.io.*;
    
    public class TestFileFilter {
        public static void main(String[] args) {
            File dirs = new File("Dir");
    
            File[] files = dirs.listFiles(new FileFilter() {
                public boolean accept(File pathname) {
                    return pathname.getName().endsWith(".java");
                }
            });
    
            // 打印文件名字
            for (File f : files) {
                System.out.println(f.getName());
            }
        }
    }
    

    输出:

    $ java TestFileFilter
    Consumer.java
    Ticket.java
    

    通过之前所学Lambda,发现上面的FileFilter接口满足只有一个接口的条件,可以使用Lambda优化,如下为优化代码:

    import java.io.*;
    
    public class TestFileFilter {
        public static void main(String[] args) {
            File dirs = new File("Dir");
    
            // File[] files = dirs.listFiles(new FileFilter() {
            //     public boolean accept(File pathname) {
            //         return pathname.getName().endsWith(".java");
            //     }
            // });
    
            // 使用Lambda优化
            File[] files = dirs.listFiles(pathname -> pathname.getName().endsWith("java"));
    
            // 打印文件名字
            for (File f : files) {
                System.out.println(f.getName());
            }
        }
    }
    

四. 综合例子

实现文件搜索:搜索指定目录下的.java文件

分析:

  1. 目录搜索,无法判断多少级目录,需要使用递归遍历所有目录。
  2. 遍历目录时,获取到的子文件,通过文件名字判断是否满足条件
import java.io.File;

public class FileDemo {
    public static void main(String[] args) {
        File dir = new File("Dir");
        search(dir);
    }

    public static void search(File dirs) {

        File[] files = dirs.listFiles(p -> p.getName().endsWith(".java") || p.isDirectory());

        // 循环打印
        for (File f : files) {
            // 如果是文件,则打印
            if (f.isFile()) {
                System.out.println(f.getName());
            }
            else {  // 是目录,则递归查找
                search(f);
            }
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值