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

简介: 为跳槽面试做准备,今天开始进入 Java 基础的复习。希望基础不好的同学看完这篇文章,能掌握泛型,而基础好的同学权当复习,希望看完这篇文章能够起一点你的青涩记忆。

一、什么是 File 类?


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


二、File 类的使用


2.1 构造方法


File 类的构造有三种:


  • 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/>
 */
publicclass 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 对象的创建。


2.2 获取功能的方法


  • public String getAbsolutePath() :返回指定 File 实例的绝对路径
  • public String getPath() :将指定 File 实例的抽象路径名转换为一个路径名字符串
  • public String getName()  :返回指定 File 实例的目录或文件名
  • 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/>
 */
publicclass 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/>
 */
publicclass 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/>
 */
publicclass 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/>
 */
publicclass 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/>
 */
publicclass 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.1 什么是递归?


指的是程序在某个方法内自己调用自己的操作。


3.2 递归的分类


递归分为两种:


  • 直接递归:称为方法自身调用自己。
  • 间接递归:可以 A 方法调用 B 方法,B 方法调用 C 方法,C 方法调用 A 方法。


3.3 递归的使用规范


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


四、递归的使用


如果你不知道什么时候使用递归?那这里有一条很简单的定律:当你明确递归次数不至于造成内存溢出是,可使用;否则,不要使用。


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


/**
 * 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/>
 */
publicclass 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


五、Github 源码地址


文章出现的所有代码都上传到我的 Github 了,觉得不错。给个 Star 呗


  • Github 源码地址


相关文章
|
1月前
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
|
14天前
|
安全 Java API
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
String常量池、String、StringBuffer、Stringbuilder有什么区别、List与Set的区别、ArrayList和LinkedList的区别、HashMap底层原理、ConcurrentHashMap、HashMap和Hashtable的区别、泛型擦除、ABA问题、IO多路复用、BIO、NIO、O、异常处理机制、反射
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
|
8天前
|
Java 大数据 API
Java 流(Stream)、文件(File)和IO的区别
Java中的流(Stream)、文件(File)和输入/输出(I/O)是处理数据的关键概念。`File`类用于基本文件操作,如创建、删除和检查文件;流则提供了数据读写的抽象机制,适用于文件、内存和网络等多种数据源;I/O涵盖更广泛的输入输出操作,包括文件I/O、网络通信等,并支持异常处理和缓冲等功能。实际开发中,这三者常结合使用,以实现高效的数据处理。例如,`File`用于管理文件路径,`Stream`用于读写数据,I/O则处理复杂的输入输出需求。
|
1天前
|
Oracle Java 关系型数据库
Linux下JDK环境的配置及 bash: /usr/local/java/bin/java: cannot execute binary file: exec format error问题的解决
如果遇到"exec format error"问题,文章建议先检查Linux操作系统是32位还是64位,并确保安装了与系统匹配的JDK版本。如果系统是64位的,但出现了错误,可能是因为下载了错误的JDK版本。文章提供了一个链接,指向Oracle官网上的JDK 17 Linux版本下载页面,并附有截图说明。
Linux下JDK环境的配置及 bash: /usr/local/java/bin/java: cannot execute binary file: exec format error问题的解决
|
24天前
|
数据采集 Java 数据挖掘
Java IO异常处理:在Web爬虫开发中的实践
Java IO异常处理:在Web爬虫开发中的实践
|
1月前
|
Java 数据处理
Java IO 接口(Input)究竟隐藏着怎样的神秘用法?快来一探究竟,解锁高效编程新境界!
【8月更文挑战第22天】Java的输入输出(IO)操作至关重要,它支持从多种来源读取数据,如文件、网络等。常用输入流包括`FileInputStream`,适用于按字节读取文件;结合`BufferedInputStream`可提升读取效率。此外,通过`Socket`和相关输入流,还能实现网络数据读取。合理选用这些流能有效支持程序的数据处理需求。
28 2
|
1月前
|
XML 存储 JSON
【IO面试题 六】、 除了Java自带的序列化之外,你还了解哪些序列化工具?
除了Java自带的序列化,常见的序列化工具还包括JSON(如jackson、gson、fastjson)、Protobuf、Thrift和Avro,各具特点,适用于不同的应用场景和性能需求。
|
1月前
|
NoSQL Java Redis
【Azure Spring Cloud】Java Spring Cloud 应用部署到Azure上后,发现大量的 java.lang.NullPointerException: null at io.lettuce.core.protocol.CommandHandler.writeSingleCommand(CommandHandler.java:426) at ... 异常
【Azure Spring Cloud】Java Spring Cloud 应用部署到Azure上后,发现大量的 java.lang.NullPointerException: null at io.lettuce.core.protocol.CommandHandler.writeSingleCommand(CommandHandler.java:426) at ... 异常
|
4月前
|
存储 Java 数据安全/隐私保护
从零开始学习 Java:简单易懂的入门指南之IO字符流(三十一)
从零开始学习 Java:简单易懂的入门指南之IO字符流(三十一)
|
1月前
|
存储 缓存 Java
15 Java IO流(File类+IO流+字节流+字符流+字节编码)
15 Java IO流(File类+IO流+字节流+字符流+字节编码)
43 3