前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Java 基础(三)| IO流之使用 File 类的正确姿势

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

作者头像
JavaFish
发布于 2020-01-14 07:04:30
发布于 2020-01-14 07:04:30
85300
代码可运行
举报
运行总次数:0
代码可运行

为跳槽面试做准备,今天开始进入 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 对象,再结合子路径创建
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * 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 对象的创建。

2.2 获取功能的方法

  • public String getAbsolutePath() :返回指定 File 实例的绝对路径
  • public String getPath() :将指定 File 实例的抽象路径名转换为一个路径名字符串
  • public String getName() :返回指定 File 实例的目录或文件名
  • public long length() :返回指定 File 实例的文件长度

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * 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 绝对路径与相对路径

  • 绝对路径:从盘符开始的完整路径
  • 相对路径:相对于你当前的项目目录的路径,在开发中常用此路径
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * 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 实例是不是文件
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * 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 实例表示的目录,以及父目录
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * 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 实例目录中的所有的子文件或目录。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * 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.1 什么是递归?

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

3.2 递归的分类

递归分为两种:

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

3.3 递归的使用规范

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

四、递归的使用

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * 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

五、Github 源码地址

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

  • Github 源码地址:https://github.com/turoDog/review_java/tree/master/src/main/java/com/nasus/file

-END-

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-01-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 一个优秀的废人 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Java基础(五)| IO 流之使用缓冲流的正确姿势
整理下以前自学的笔记,留个念想,不喜轻喷。希望基础不好的同学看完这篇文章,能掌握缓冲流,而基础好的同学权当复习,希望看完这篇文章能够起一点你的青涩记忆。
JavaFish
2020/02/24
9850
Java 基础(四)| IO 流之使用文件流的正确姿势
为跳槽面试做准备,今天开始进入 Java 基础的复习。希望基础不好的同学看完这篇文章,能掌握泛型,而基础好的同学权当复习,希望看完这篇文章能够起一点你的青涩记忆。
JavaFish
2020/01/14
1.1K0
Java 基础(四)| IO 流之使用文件流的正确姿势
java基础第十五篇之IO流和递归算法
缓冲区会在内存中创建一个8192容量的字节数组,内存的运算效率比硬盘要高的多所有只要降低到硬盘的读写次数就会提高效率.
海仔
2019/08/05
1.4K0
java之java.io.File的相关方法
文件流:FileInputStream、FileOutputStream、FileReader、FileWriter
西西嘛呦
2020/08/26
3280
Java File类
把视频名全部重命名 把E:\java目录下所有以java结尾的绝对路径输出控制台
Tim在路上
2020/08/04
9050
深入死磕 Java IO 流
我们日常开发过程中,有许多方面都涉及到 IO 流,比如上传下载、传输、设计模式等等。而所有的一切都是基于 IO 流来进行,所以今天就来看看 Java 中 IO 流的相关知识点。
村雨遥
2022/06/15
3540
深入死磕 Java IO 流
一文打通File类
以pathname为路径创建File对象,可以是绝对路径或者相对路径,如果 pathname是相对路径,则默认的当前路径在系统属性user.dir中存储。 绝对路径:是一个固定的路径,从盘符开始 相对路径:是相对于某个位置开始
一个风轻云淡
2023/10/15
1630
一文打通File类
21天学习挑战赛之java的IO流
​ 把“E:\itcast\窗里窗外.txt”复制到模块目录下的“窗里窗外.txt” (文件可以是任意文件)
楠羽
2022/11/18
3440
Java IO流
​ 根据路径构建一个Fiile对象:new File (String pathname);
卢衍飞
2023/02/16
1.3K0
"Java中的File类、IO基础、IO分类以及字节流的重要性"
Java的File类是用于处理文件和目录的核心类之一。它提供了一种用于访问文件系统的抽象方法,允许你创建、读取、写入、删除文件和目录,以及查询文件和目录的属性。
杨不易呀
2023/10/02
2770
JAVA IO流
什么是IO,即Input和Output输入与输出,通过IO可以完成硬盘文件的读和写。
用户9691112
2023/06/10
2050
JAVA IO流
java 文件操作对象 IO流
{/tabs-pane} {tabs-pane label="printlnfiles方法"}
await
2021/09/09
5600
第53节:Java当中的IO流(上)
标题图 Java当中的IO流 在Java中,字符串string可以用来操作文本数据内容,字符串缓冲区是什么呢?其实就是个容器,也是用来存储很多的数据类型的字符串,基本数据类型包装类的出现可以用来解决字
达达前端
2019/07/03
5550
第53节:Java当中的IO流(上)
JAVAEE工程师零基础学习教程之泛型类和File类
​ 在前面学习集合时,我们都知道集合中是可以存放任意对象的,只要把对象存储集合后,那么这时他们都会被提升成Object类型。当我们在取出每一个对象,并且进行相应的操作,这时必须采用类型转换。
用户9184480
2024/12/13
960
【Java】File类、递归
java.io.File 类是文件和目录路径名的抽象表示,主要用于文件和目录的创建、查找和删除等操作。
陶然同学
2023/02/27
6870
【Java】File类、递归
IO流介绍与File类
io就是Input/Output的缩写形式,Input是输入流,Output是输出流。
端碗吹水
2020/09/23
4490
IO流介绍与File类
Java基础(二十二):File类与IO流
java.io.Reader抽象类是表示用于读取字符流的所有类的父类,可以读取字符信息到内存中。它定义了字符输入流的基本共性功能方法
冬天vs不冷
2025/01/21
920
Java基础(二十二):File类与IO流
Java基础之IO流(一)
回想之前写过的程序,数据都是在内存中,一旦程序运行结束,这些数据都没有了,等下次再想使用这些数据,可是已经没有了。那怎么办呢?能不能把运算完的数据都保存下来,下次程序启动的时候,再把这些数据读出来继续使用呢?其实要把数据持久化存储,就需要把内存中的数据存储到内存以外的其他持久化设备(硬盘、光盘、U盘等)上
Remember_Ray
2020/08/05
4200
Java中的File类
在Java编程中,对文件和目录的操作的需求非常普遍。Java提供了java.io.File类作为文件和文件目录路径的抽象表示形式。这个类与平台无关,允许我们创建、删除、重命名文件和目录,但它本身并不直接访问文件内容。对于文件内容的访问,我们通常需要借助输入/输出流。
一个风轻云淡
2024/04/29
2080
Java 基础(一)| 使用泛型的正确姿势
为跳槽面试做准备,今天开始进入 Java 基础的复习。希望基础不好的同学看完这篇文章,能掌握泛型,而基础好的同学权当复习,希望看完这篇文章能够起一点你的青涩记忆。
JavaFish
2020/01/14
5810
Java 基础(一)| 使用泛型的正确姿势
相关推荐
Java基础(五)| IO 流之使用缓冲流的正确姿势
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文