张小飞的Java之路——第四十一章——File

news2025/3/1 10:07:42

写在前面:

视频是什么东西,有看文档精彩吗?

视频是什么东西,有看文档速度快吗?

视频是什么东西,有看文档效率高吗?


介绍

诸小亮:从今天开始,我们学习 IO 流

张小飞:IO 流?这是做什么用的?

诸小亮:IO流——就是InputOutput 流,用来处理设备之间的数据传输,比如:

image.png
张小飞:数据从内存到硬盘是Output,从硬盘到内存是Input,是这样理解吗?

诸小亮:是的,一个 txt 文件

  • 打开:是记事本程序把数据从硬盘加载到内存中经过处理展现在屏幕上,这是 Input
  • 保存:是记事本程序把数据从内存输出到硬盘上,这是Output

张小飞:嗯嗯,好的,不过这个Java 有什么关系呢?

诸小亮:Java中对文件的操作是通过流的方式

流:是系统资源,也可以认为是系统工具,java通过流从硬盘上获取数据,处理后再通过流存储到硬盘上

注意:因为流是系统资源,所以使用后需要释放(稍后演示)

张小飞:既然如此,还是赶紧演示一下吧

File

诸小亮:我们首先看——File 类

  • File:是 java 中描述文件和文件夹的类

张小飞:所以,Java中就是通过操作 File 对象,就能操作硬盘上的文件?

诸小亮:是的,学习IO流,就是处理硬盘上的文件,所以先学习 File 类

创建File对象

张小飞:那么,怎么使用这个 File 类呢?

诸小亮:我们先看看如何创建对象

绝对路径

诸小亮:把硬盘上的文件封装成 File 对象,比如:

//将一个具体路径封装成 File 对象
File file = new File("G:\\learn\\123.txt");//之所以使用"\\"是因为"\"在java字符串中是转义符

张小飞:我们电脑上没有代码中的文件吧

诸小亮:没关系,创建 File 对象时,提供的路径可以存在,也可以不存在

张小飞:好的

相对路径

诸小亮:上面创建对象时提供的是绝对路径,也可以封装相对路径,比如:

image.png

张小飞:相对路径是???

诸小亮:相对路径依赖于我们 Java 项目所处的位置,比如:

image.png

诸小亮:所以它的绝对路径是——G:\lrn\javaDemo\learn\abc.txt

张小飞:可以把它路径给打印出来吗?

诸小亮:可以,使用 getAbsoluteFile() 方法就行了,比如:

image.png

结果:image.png

注意:windows中,相对路径以盘符开头,比如:G:\learn,不以盘符开头的都是相对路径

File(String parent, String child)

诸小亮:另外,通过以下方式也能创建 File 对象

//两个参数:第一个是父路径,第二个是子路径
File file = new File("G:\\learn", "123.txt");
File file2 = new File("G:\\learn\\123.txt");

张小飞:上面代码中,file 和 file2 表示的是同一个文件吗?

诸小亮:是的

张小飞:这样的话,感觉第一种没有第二种方便啊,为什么要吧路径拆分开呢?

诸小亮:这是你的错觉,把路径拆分,父路径可以做为一个变量了

张小飞:工作中用第一种方式的多吗?

诸小亮:额。。。,好吧,这种方式并不常用,了解了解就行了

File(File parent, String child)

诸小亮:既然说到了这里,就说一个构造方法——File(File parent, String child)

File parent = new File("G:\\learn");
//一个父文件,一个子路径
File file = new File(parent, "123.txt");

结果:

image.png

File.separator:路径分隔符

诸小亮:下面我们说说—— File.separator

张小飞:这是啥东西

诸小亮:这是路径分隔符,不同操作系统下,文件路径是不一样的,比如:

  • winows:G:\learn\123.txt
  • Linux:/home/123.txt

张小飞:原来还有这种说法

诸小亮:为了使路径分隔符统一,Java中定义了 File.separator 来表示路径分隔符

张小飞:您的意思是,在创建 File 对象时候要使用 File.separator 吗?

诸小亮:不错,最好如此,比如:

image.png
结果:image.png

张小飞:明白了

常用方法

诸小亮:下面介绍一些 File 类中常用的方法

基本方法

public static void main(String[] args) throws IOException {
    File file = new File("G:\\learn\\yase.txt");
    System.out.println("文件名:    " + file.getName());
    System.out.println("文件大小:   " + file.length());//单位:字节
    System.out.println("文件绝对路径:   " + file.getAbsolutePath());
    System.out.println("文件所在目录:   " + file.getParent());
    System.out.println("是否是目录:   " + file.isDirectory());
    //System.out.println("是否是文件:   " + file.isFile());
    System.out.println("是否存在:   " + file.exists());
}

结果:image.png

createNewFile

createNewFile:指定的文件不存在时,可以用这个方法创建文件,比如:

File file = new File("G:\\learn\\daji.txt");//文件在硬盘上不存在
boolean bool = file.createNewFile();//创建文件,返回true表示成功
System.out.println(bool);

结果:image.png,硬盘上文件也就存在了
image.png
张小飞:那如果文件已经存在了呢?

诸小亮:。。。。,当然是返回 false 了

delete

delete:删除文件,true:删除成功,false:删除失败,比如:

image.png

结果:image.png

张小飞:不对啊,我这里怎么删除失败了,您看看

诸小亮:我不看也知道,你删除的是一个文件夹吧

张小飞:您怎么知道?

诸小亮:因为删除文件夹,必须先清空文件夹中的内容,比如:

image.pngimage.png

结果:image.png




诸小亮:当文件夹中没有内容时,可以删除

image.png

再次执行:image.png

张小飞:明白了

mkdir

张小飞:可以用 File 创建一个文件夹吗?

诸小亮:当然可以,使用 mkdir 命令就行了

  • mkdir:创建目录,如果 File 是个目录,可以使用这个方法,比如:
File file = new File("G:\\learn\\lvbu");
boolean bool = file.mkdir();//创建目录
System.out.println(bool);

结果:image.png,再去硬盘上查看,就可以看到 lvbu 这个目录了

张小飞:创建多级目录呢?

诸小亮:那就要使用 mkdirs 方法了

  • mkdirs:创建多级目录

image.png

结果:image.png

张小飞:原来如此

isDirectory

张小飞:对了,刚发现,文件夹也是用 File 来表示

诸小亮:是的啊,怎么了

张小飞:这样的话,如果区分一个 File 对象是文件还是文件夹呢?

诸小亮:没关系,可以使用 isDirectory 方法,返回 true 就表示是个文件夹

张小飞:好的,我试试

诸小亮:不过需要注意

image.png

结果:image.png

张小飞:注意什么呢?

诸小亮:上图中,硬盘上没有 diaochan 这个文件或文件夹,但是 isDirectory 返回 false

张小飞:噢噢,明白了

诸小亮:所以说,在调用 isDirectory 前,先要确认 File 是否已经存在

张小飞:好的,我记下了

renameTo

renameTo:重命名,比如:

image.png

结果:image.png

list

list():返回 File 目录下所有的文件和文件夹名称,返回值:字符串数组,比如:

public static void main(String[] args){
    File file = new File("G:\\learn");
    
    //列出 G:\\learn 下所有的文件夹和文件
    String[] list = file.list();
    for(String name : list){
        System.out.println(name);
    }
}

结果:image.png

诸小亮:如果指定的 File 并不存在,返回 null,比如:

image.png

结果:image.png

张小飞:如果一个文件夹中文件太多,我只想要其中某些文件呢?

诸小亮:可以指定过滤器,只返回指定格式的文件,比如:

public static void main(String[] args){
    File file = new File("G:\\learn");
    //使用 FilenameFilter(文件名过滤器) ,过滤出指定类型的文件
    String[] list = file.list(new FilenameFilter() {
        /**
         * @param dir 就是上面的file对象
         * @param name 是 G:\learn 目录下的文件或文件夹名称
         * @return
         */
        @Override
        public boolean accept(File dir, String name) {
            return name.endsWith(".txt");//过滤出 G:\learn 下的 txt 文件
        }
    });
    for(String name : list){
        System.out.println(name);
    }
}

结果:image.png

listFiles

listFiles:返回 File 下所有的文件和文件夹,并封装成 File 对象

public static void main(String[] args){
    File file = new File("G:\\learn");
    //列出 G:\learn 下所有的文件,并封装成 File 对象
    File[] files = file.listFiles();
    for(File f : files){
        System.out.println(f.getAbsoluteFile());
    }
}

结果:image.png如果指定的路径不存在,返回null

张小飞:这个也能用 FilenameFilter 吗?

诸小亮:可以的,同时也能用 FileFilter(文件过滤器),比如:

public static void main(String[] args){
    File file = new File("G:\\learn");
    //列出 G:\learn 下所有的文件,并封装成 File 对象
    File[] files = file.listFiles(new FileFilter() {
        /**
         * @param pathname G:\learn 下的 File 对象
         * @return
         */
        @Override
        public boolean accept(File pathname) {
            //过滤出 G:\learn 下的 txt 文件
            return pathname.getAbsolutePath().endsWith(".txt");
        }
    });
    for(File f : files){
        System.out.println(f.getAbsoluteFile());
    }
}

结果:image.png

递归

张小飞:什么是递归?

诸小亮:递归——在方法中,自己调用自己

张小飞:还能自己调用自己?

诸小亮:当然可以了,比如——获取过一个目录下的所有文件和文件夹,包括子目录中的文件

public static void main(String[] args){
    File file = new File("G:\\learn");
    getFile(file);
}

private static void getFile(File file) {
    if(file.exists() && file.isDirectory()){
        for(File f : file.listFiles()){
            System.out.println(f.getAbsoluteFile());
            if(f.isDirectory()){
                getFile(f);//自己内部调用自己
            }
        }
    }
}

结果:image.png

张小飞:可否说说,使用 递归 的场景呢?

诸小亮:当方法需要被重复使用,且每次传递的参数不同时,可以考虑递归

张小飞:额。。。。,能不能再举个例子?

诸小亮:这简单,计算 6 的阶乘

分析:6!=65!,5!=54!。。。。,可以使用递归

public static void main(String[] args){
    System.out.println(sum(6));// 输出:720
}
//计算 num 的阶乘
private static int sum(int num) {
    if(num==1){
        return 1;
    }
    return num * sum(num-1);
}

张小飞:明白了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/581415.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CAPL(vTESTStudio) - CAPL控制程控电源IT6332A

目录 为什么要使用CAPL控制程控电源? 一、程控电源的选择 二、程控电源通信协议

Junit5单元测试框架详解

前面我们学习了Selenium自动化测试框架,但是有的时候测试用例会很多,我们需要一个工具来管理这些测试用例,而Junit就是一个很好的管理工具,简单点来说,Junit就是一个针对Java的单元测试框架; 目录 一. 关于…

凸优化系列——凸集

1.最优化问题概述 最优化问题是决策问题,选择一些可以执行的策略使得目标最优;一个最优化问题包括 决策变量;一个或多个目标函数;一个由可行策略组成的集合,可由等式或者不等式刻画; 最优化问题的形式: 最优化问题的分类 无约束优化问题和…

【C++】函数 - 定义,调用,值传递,常见样式,声明,分文件编写

文章目录 1. 函数的定义2. 函数的调用3. 值传递4. 常见的样式5. 函数的声明6. 函数的分文件编写 所谓数组,就是一个集合,里边存放了相同类型的数据元素。 特点1:数组中的每个数据元素都是相同的数据类型 特点2:数组是由连续的内存…

chatgpt赋能python:Python在SEO中的作用:不简单的搜索引擎优化工具

Python在SEO中的作用:不简单的搜索引擎优化工具 Python作为一种强大的编程语言,已经在各个领域中得到了广泛的应用。在搜索引擎优化(SEO)领域,Python也发挥了重要作用。 Python在SEO中的应用 程序化爬虫 很多SEO工…

(c语言)将一句话的单词进行倒置,标点不倒置(i like beijing.)

目录 例子: 思路方法: ​编辑 (分板块)代码的实现: 一.字符串的获取(3种简单的方法) 1.用gets()函数,即使中间有空格也会读取 2.用fgets(&am…

RK3588平台开发系列讲解(项目篇)RKNN-Toolkit2 的使用

平台内核版本安卓版本RK3588Linux 5.10Android 12文章目录 一、RKNN-Toolkit2安装二、模型转换和模型推理三、性能和内存评估沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 NPU 是专门用于神经网络的处理单元。它旨在加速人工智能领域的神经网络算法,如机器视觉和自…

c#快速入门(2)

欢迎来到Cefler的博客😁 🕌博客主页:那个传说中的man的主页 🏠个人专栏:题目解析 🌎推荐文章:题目大解析2 目录 👉🏻类、对象、类成员简介👉🏻语句…

chatgpt赋能python:Python的不断循环:了解你需要知道的

Python的不断循环:了解你需要知道的 Python是一个流行的编程语言,它被许多开发者用于构建各种应用程序和工具。 在Python中,有一个常见的编程概念,它被称为“循环”。 循环可以让程序在不停止执行的情况下重复执行一些代码。 在本…

人体行为足力特征分析及其应用研究_kaic

第一章 绪论 随着社会现代化的发展和科技的不断进步,我国航天事业蓬勃发展,与此同时产生了很多亟待解决的难题,康复医疗成为航天医学和康复领域的重要课题之一。载人航天实践证明,失重对航天员生理功能有很大影响,这不…

(2020)高频成分有助于解释卷积神经网络的泛化

High-frequency Component Helps Explain the Generalization of Convolutional Neural Networks 公众号:EDPJ 目录 0. 摘要 1. 简介 2. 相关工作 3. 高频成分 & CNN 的泛化 3.1 CNN 利用高频成分 3.2 鲁棒性和准确性之间的权衡 4. 在重新思考泛化之前…

安装远程软件rustdesk中报错 Error! Could not locate dkms.conf file. File: does not exist.

解决方法 省流:uname -r 查看当前内核,找到/usr/src/目录下的多余的内核文件,删除残留多余的内核文件 原因可能是当时安装nvidia显卡驱动的时候没删除掉旧的内核文件,某些模块或驱动程序可能与特定内核版本相关联,如…

chatgpt赋能python:Python中5!怎么算的?一篇简易教程

Python中5!怎么算的?一篇简易教程 在Python中,可以使用一段小小的代码来进行阶乘的计算。本篇文章将带领您了解如何使用Python计算5的阶乘,为您的程序设计带来便利。 介绍 计算阶乘是一项非常基础的数学计算,它常常…

django+python协同过滤推荐算法网上购物商城系统的n9u33

本毕业设计的内容是设计实现一个基于 Django框架的智能推荐算法。它是以 Python语言,MYSQL为数据库开发平台,Tomcat网络信息服务作为应用服务器。智能推荐算法的功能已基本实现,主要包括用户、商品分类、购物商品、订单等。本项目软件架构选择…

《数据库应用系统实践》------ 包包销售系统

系列文章 《数据库应用系统实践》------ 包包销售系统 文章目录 系列文章一、需求分析1、系统背景2、 系统功能结构(需包含功能结构框图和模块说明)3.系统功能简介 二、概念模型设计1.基本要素(符号介绍说明&#xff…

vector的实现(c++)

前言 vector是很重要的数据结构,所以了解它的底层的核心原理是很有必要的,如何了解它的底层原理呢?除了阅读原码外,自己实现一下vector的核心逻辑也是不错的选择。 目录 1.四个默认成员函数 2.迭代器的实现 3.增删查改 4. 容…

栈踩踏实验

程序的存储结构 分布 在磁盘和内存中的分布如下: 节视图 .data:已经初始化的全局变量/局部静态变量 .bss:未初始化的全局变量/局部静态变量 .got.plt:全局偏移量表,保存全局变量引用的地址 .rodata:只读…

2023 Idea 热部署 JRebel 插件激活方法

2023 Idea 热部署 JRebel 插件激活方法 1. 下载源代码 进入下面 github 地址 clone 代码到本地 https://github.com/Byron4j/JrebelLicenseServerforJava 2. 编译和打包 cd /Users/daixiaohu/Desktop/JrebelLicenseServerforJavamvn clean package3. 运行项目 cd target/jav…

前端项目搭建以及项目配置

前端项目搭建 - vitevue3.0ant vite比起webpack速度更快 vite搭建项目 https://cn.vitejs.dev/ 步骤: 1.打开cmd 2.找到项目应该建的文件夹 比如直接建到桌面上 cd desktop3.创建项目 使用创建项目命令,然后根据提示填写项目名称,以及要…

计算机视觉基础:锚框

锚框 目标检测算法通常会在输入图像中采样大量的区域,然后判断这些区域中是否包含我们感兴趣的目标,并调整区域边界从而更准确地预测目标的真实边界框(ground-truth bounding box)。 不同的模型使用的区域采样方法可能不同。 这里…