Java 基础(三)| IO流之使用 File 类的正确姿式

File

为跳槽面试作准备,今天开始进入 Java 基础的复习。但愿基础很差的同窗看完这篇文章,能掌握泛型,而基础好的同窗权当复习,但愿看完这篇文章可以起一点你的青涩记忆。前端

1、什么是 File 类?

java.io.File 类是文件和目录路径名的抽象表示,主要用于文件和目录的建立、查找和删除等操做。java

2、File 类的使用

2.1 构造方法

File 类的构造有三种:python

  • public File(String pathname) : 直接经过文件路径字符串建立
  • public File(String parent, String child) : 经过父和子路径字符串建立
  • public File(File parent, String child) : 先建立父级 file 对象,再结合子路径建立
/** * Project Name:review_java <br/> * Package Name:com.nasus.io.file <br/> * Date:2020/1/3 22:22 <br/> * * @author <a href="turodog@foxmail.com">chenzy</a><br/> */
public class FileConstruct {

    public static void main(String [] args) {
        // 文件路径名
        String pathname = "Z:\\file\\file.txt";
        File file1 = new File(pathname);
        System.out.println(file1);

        // 经过父路径和子路径字符串
        String parent = "Z:\\file";
        String child1 = "file.txt";
        File file2 = new File(parent, child1);
        System.out.println(file2);

        // 经过父级 File 对象和子路径字符串
        File parentDir = new File("Z:\\file");
        String child2 = "file.txt";
        File file3 = new File(parentDir, child2);
        System.out.println(file3);
    }

}
复制代码

三种建立 File 对象的方法如上所示,此外须要说明的是:一个 File 对象表明硬盘中的目录或者文件,而这个目录或文件在硬盘中是否存在不影响 File 对象的建立。linux

2.2 获取功能的方法

  • public String getAbsolutePath() :返回指定 File 实例的绝对路径c++

  • public String getPath() :将指定 File 实例的抽象路径名转换为一个路径名字符串git

  • public String getName() :返回指定 File 实例的目录或文件名github

  • public long length() :返回指定 File 实例的文件长度面试

在硬盘 Z:\file 下,新建一个 file.txt 文件,文件内容是 26 个英文字母。算法

/** * Project Name:review_java <br/> * Package Name:com.nasus.io.file <br/> * Date:2020/1/4 11:01 <br/> * * @author <a href="turodog@foxmail.com">chenzy</a><br/> */
public class FileGet {

    public static void main(String[] args) {

        File file1 = new File("Z:"+ File.separator + "file" + File.separator + "file.txt");
        System.out.println("文件绝对路径:"+file1.getAbsolutePath());
        System.out.println("文件构造路径:"+file1.getPath());
        System.out.println("文件名称:"+file1.getName());
        System.out.println("文件长度:"+file1.length()+"字节");

        System.out.println("----------------------");

        // 表示根目录, 在 windows 下:File.separator + "file" = "\\file"
        File file2 = new File(File.separator + "file");
        // 绝对路径
        System.out.println("目录绝对路径:"+file2.getAbsolutePath());
        // 构造 File 实例时的路径
        System.out.println("目录构造路径:"+file2.getPath());
        System.out.println("目录名称:"+file2.getName());
        // file 示例为目录,因此长度 = 0
        System.out.println("目录长度:"+file2.length());
    }

}
复制代码

File 的 get 方法如上示例,值得注意的是:getPath() 与 getAbsolutePath() 的区别在于,前者获取的是构造 File 实例时的路径,后者获取的是 File 实例的绝对路径。当构造 File 实例的路径也是绝对路径时,两者是同样的。小程序

2.3 绝对路径与相对路径

  • 绝对路径:从盘符开始的完整路径
  • 相对路径:相对于你当前的项目目录的路径,在开发中经常使用此路径
/** * Project Name:review_java <br/> * Package Name:com.nasus.io.file <br/> * Date:2020/1/4 11:29 <br/> * * @author <a href="turodog@foxmail.com">chenzy</a><br/> */
public class FilePath {

    public static void main(String[] args) {
        // Z盘下的 file.txt 文件
        File file = new File("Z:\\file.txt");
        System.out.println(file.getAbsolutePath());

        // 项目下的 file.txt 文件
        File file2 = new File("file.txt");
        System.out.println(file2.getAbsolutePath());
    }

}

输出结果:
Z:\file.txt
Z:\IDEAProject\review\review_java\file.txt
复制代码

2.4 判断功能的方法

判断功能的方法主要有三个,输出都是布尔值:

  • public boolean exists() :指定 File 实例表明的文件或者目录是否存在
  • public boolean isDirectory() :指定 File 实例是否是目录
  • public boolean isFile() :指定 File 实例是否是文件
/** * Project Name:review_java <br/> * Package Name:com.nasus.io.file <br/> * Date:2020/1/4 11:37 <br/> * * @author <a href="turodog@foxmail.com">chenzy</a><br/> */
public class FileIs {

    public static void main(String[] args) {
        File file1 = new File("Z:\\file\\file.txt");
        File file2 = new File("Z:\\file");
        // 判断是否存在
        System.out.println("Z:\\file\\file.txt 是否存在:"+file1.exists());
        System.out.println("Z:\\file 是否存在:"+file2.exists());
        // 判断文件
        System.out.println("Z:\\file\\file.txt 文件?:"+file1.isFile());
        System.out.println("Z:\\file 文件?:"+file2.isFile());
        // 判断目录
        System.out.println("Z:\\file\\file.txt 目录?:"+file1.isDirectory());
        System.out.println("Z:\\file 目录?:"+file2.isDirectory());
    }

}

输出结果:
Z:\file\file.txt 是否存在:true
Z:\file 是否存在:true
Z:\file\file.txt 文件?:true
Z:\file 文件?:false
Z:\file\file.txt 目录?:false
Z:\file 目录?:true
复制代码

2.5 建立与删除方法

  • public boolean createNewFile() :指定 File 实例的文件不存在时,建立空文件
  • public boolean delete() :删除指定 File 实例表示的文件或目录
  • public boolean mkdir() :建立指定 File 实例表示的目录
  • public boolean mkdirs() :建立指定 File 实例表示的目录,以及父目录
/** * Project Name:review_java <br/> * Package Name:com.nasus.io.file <br/> * Date:2020/1/4 11:49 <br/> * * @author <a href="turodog@foxmail.com">chenzy</a><br/> */
public class FileCreateDelete {

    public static void main(String[] args) throws IOException {
        System.out.println("-----建立文件------");
        // 文件的建立
        File file1 = new File("file1.txt");
        System.out.println("是否存在:"+file1.exists()); // false
        System.out.println("是否建立:"+file1.createNewFile()); // true
        System.out.println("是否存在:"+file1.exists()); // true

        System.out.println("-----建立目录------");

        // 目录的建立
        File file2 = new File("fileDir");
        System.out.println("是否存在:"+ file2.exists());// false
        System.out.println("是否建立:"+ file2.mkdir());	// true
        System.out.println("是否存在:"+ file2.exists());// true

        System.out.println("-----建立多级目录------");

        // 建立多级目录
        File file3= new File("fileDir1\\fileDir2");
        System.out.println(file3.mkdir());// false
        File file4 = new File("fileDir1\\fileDir2");
        System.out.println(file4.mkdirs());// true

        System.out.println("-----删除文件------");

        // 文件的删除
        System.out.println(file1.delete());// true

        System.out.println("-----删除目录------");
        
        // 目录的删除
        System.out.println(file2.delete());// true
        System.out.println(file4.delete());// false
    }

}
复制代码

2.6 目录的遍历

  • public String[] list() :返回一个 String 数组,表示指定 File 实例目录中的全部子文件或目录。

  • public File[] listFiles() :返回一个 File 数组,表示指定 File 实例目录中的全部的子文件或目录。

/** * Project Name:review_java <br/> * Package Name:com.nasus.io.file <br/> * Date:2020/1/4 12:02 <br/> * * @author <a href="turodog@foxmail.com">chenzy</a><br/> */
public class FileList {

    public static void main(String[] args) {
        File dir = new File("Z:\\IDEAProject");

        //获取当前目录下的文件以及文件夹的名称,用处不大。
        String[] names = dir.list();
        for(String name : names) {
            System.out.println(name);
        }
        System.out.println("--------------------------------");
        //获取当前目录下的文件以及文件夹对象,拿到了文件对象,能够作更多操做,项目经常使用
        File[] files = dir.listFiles();
        for (File file : files) {
            System.out.println(file);
        }
    }

}
复制代码

值得注意的是:不论是 list() 仍是 listFiles() 方法,所指定的 File 实例都必须是在硬盘中实际存在的,不然没法遍历。

3、递归

3.1 什么是递归?

指的是程序在某个方法内本身调用本身的操做。

3.2 递归的分类

递归分为两种:

  • 直接递归:称为方法自身调用本身。
  • 间接递归:能够 A 方法调用 B 方法,B 方法调用 C 方法,C 方法调用 A 方法。

3.3 递归的使用规范

  • 递归必定要有条件限定,保证递归可以中止下来,不然会发生栈内存溢出
  • 在递归中虽然有限定条件,可是递归次数不能太多。不然也会发生栈内存溢出
  • 构造方法,禁止递归

4、递归的使用

若是你不知道何时使用递归?那这里有一条很简单的定律:当你明确递归次数不至于形成内存溢出是,可以使用;不然,不要使用。

递归有不少的使用场景,好比递归求和,递归阶乘。而递归多级目录、遍历文件、搜索文件是咱们在开发中经常使用的,它是这么实现的:

/** * Project Name:review_java <br/> * Package Name:com.nasus.io.file <br/> * Date:2020/1/4 12:15 <br/> * * @author <a href="turodog@foxmail.com">chenzy</a><br/> */
public class FileSearch {

    public static void main(String[] args) {
        // 建立 File 对象
        File dir  = new File("Z:\\IDEAProject");
        // 调用文件搜索方法
        searchFile(dir);
    }

    public static void searchFile(File dir) {
        // 获取子文件和目录
        File[] files = dir.listFiles();
        // 循环遍历
        for (File file : files) {
            // 判断
            if (file.isFile()) {
                // 输出查找的目标文件的绝对路径
                if ("FileIs.java".equals(file.getName())){
                    System.out.println("目标文件路径:"+ file.getAbsolutePath());
                }
            } else {
                // 是目录,调用自身,造成递归
                searchFile(file);
            }
        }
    }

}

输出结果:
目标文件路径:Z:\IDEAProject\review\review_java\src\main\java\com\nasus\io\file\FileIs.java
复制代码

5、源码地址

Github源码地址:github.com/turoDog/rev…

最后

若是看到这里,喜欢这篇文章的话,帮忙 " 转发 "或者点个" 在看 ",行吗?祝大家 2020 暴富。微信搜索「一个优秀的废人」,欢迎关注。

回复「1024」送你一套完整的 java、python、c++、go、前端、linux、算法、大数据、人工智能、小程序以及英语教程。

回复「电子书」送你 50+ 本 java 电子书。

最全教程
相关文章
相关标签/搜索