JavaEE初阶---文件IO总结
文章目录
- 1.文件初识
- 2.java针对于文件的操作
- 2.1文件系统的操作---file类
- 2.2文件内容的操作---流对象的分类
- 2.4字符流的操作===》文本文件
- 2.4.1异常的说明
- 2.4.2第一种文件内容的读取方式
- 2.4.3第二种读取方式
- 2.4.4close的方法的介绍
- 2.4.5close的使用优化操作
- 2.4.6内容的写入
- 2.3字节流的操作===》二进制文件
- 2.4一些其他的读取方式
- 2.5字节流字符流转换
- 3.练习程序:扫描指定的目录
1.文件初识
我们通常情况下说的这个文件:指的是这个硬盘数据的一个载体,就是硬盘里面的数据;
机械硬盘:擅长顺序读写;
固态硬盘:里面是集成度很高的芯片,效率比机械硬盘高很多;
我们还需要了解诸如这个路径,绝对路径相对录得等相关的知识;
2.java针对于文件的操作
2.1文件系统的操作—file类
pathSeparator----文件的路径的分隔符号;
在我们的这个windows上面,其实无论是正斜杠还是反斜杠这个都是可以作为我们的路径分隔符的;
File对象表示的就是这个硬盘上面的文件,在进行这个对象的构造的时候,需要把这个文件的路径作为参数进行指定;
下面的这个展示的就是我们的这个新创建的这个对象里面的这个对应的可以使用的一些方法:
getpath就是获取这个文件的路径;
getname就是获取这个文件的名字;
getcanonicalpath就是对于这个绝对的路径进行简化;
getparent就是获取这个文件的父目录,也就是这个文件的上一层目录结构;

上面的这个案例可能还看不出来这个getcanonicalPath方法和这个getpath的区别,好像就是把这个盘符的小写变成了大写的,下面的这个例子其实也是为了让我们明白两者的区别,这个getCanonicalPath实际上是针对于这个绝对的路径进行了简化:
因为我们可以看到这个绝对路径和我们的这个最后一个方法的打印结果相比,就是对了一个.,但是这个.的存在其实是可有可无的,因此可以理解为这个getCanonical方法就是对于这个绝对路径获取结果的一个简化的操作;

查看这个文件是不是存在的;
查看这个文件是不是一个目录结构;
查看这个是不是一个文件;
如果上面查看的这个文件是不存在的,买这个时候我们就可以使用这个create的方法去创建一个新的文件,然后再次去检查,这个时候这个文件就是存在的;

下面的这个是针对于文件的删除的操作:delete就是立即删除,onexit就是等待这个进程结束之后再删除;
就是这个我们日常使用的这个office进行这个文档的撰写或者是这个ppt,word之类的这个制作的时候,我们的这个对应的文档的存放的位置实际上会产生一个临时文件的,这个文件的原理就是为了防止突然的断电导致这个文件内容的丢失,但是因为现在的这个笔记本都是电池,因此这个在我们的这个笔记本上面,显示不出来效果;
但是我们打开这个隐藏文件的选项,实际上是可以看到这个隐藏的文件的

下面的这个是使用的这个list方法查看这个目录下面的这个所有的文件内容,返回值是一个字符串的数组,我们如果直接打印,打印的结果是哈希值,需要使用这个toString方法对于这个进行转换之后打印输出;

创建目录的方法:我们可以使用这个mkdir创建指定的这个目录,我们也可以使用这个mkdirs创建多个层级结构的目录;

2.2文件内容的操作—流对象的分类
字符流:对应的文件是我们的文本文件,本质上是针对于这个字节流进行了封装,字符流实际上就是把这个文本文件里面的这个相邻的字节,转换为一个字符;
字节流:对应的文件是我们的二进制文件;
2.4字符流的操作===》文本文件
这个字符流主要是针对于这个文本文件,这个里面主要就是了解这个reader和writer两个类创建的这个对象里面可以进行调用的方法;
2.4.1异常的说明
下面的这个首先是想要对于这个对象的创建过程中出现的异常进行说明,就是我们的这个reader实际上是一个抽象类,因此我们使用这个类去创建对象的时候是不可以直接new对象的,因此我们使用这个new FileReader的方法去创建这个对应的对象,但是这个对象的创建过程中会抛出异常,就是下面的这个第一张图片里面出现的这个filenotfoundexception的异常;
但是我们使用这个对象的方法去调用这个read方法从这个文件里面读取数据内容的时候,这个方法调用的时候也是会抛出来异常的,这个就是我们的IOexception就是输入输出异常;
这个时候我们的这个异常的抛出之后就会把之前的这个filenotfound的这个异常给改掉,其实这个是没有任何的影响的,这个主要就是因为我们的这个异常是上一次抛出的这个异常的父类,两者之间是有这个类的继承关系的;

2.4.2第一种文件内容的读取方式
下面的这个就是我们使用我们创建的reader进行这个文件的内容的读取,为什么这个reader的方法的这个返回值是这个int类型的数据,这个主要是编码和其他的一些原因;
java的这个字符流里面其实使用的是这个unicode编码的方式,这个编码方式的编码的范围就是0~65535大小,而一个char类型的字符正好是65535的大小,可以容纳这个unicode的编码值,但是我们使用这个int类型这个更宽的字符进行处理的时候,我们使用这个-1进行这个特殊情况的表示—就是我们的这个读取的过程结束了,因此这个使用int作为我们的这个方法的返回值也是出于这个特殊值的一个考量;
我们使用这个while进行控制,这个n记录的就是我们的这个读取的字符的个数,当我们读取到这个文件的末尾的时候,这个读取的过程就会结束,然后把我们的读取的内容每一次读取之后都需要进行输出的操作;

2.4.3第二种读取方式
其实说成是这个第二种读取方式也不是很合适,就是这个方法里面多加了参数,也就是我们的这个字符数组,我们把这个读取的内容存放到这个字符数组里面去,然后就可以最后对于这个字符数组进行循环遍历,然后把我们的这个字符数组里面的这个内容进行打印输出;
这个还是使用这个-1进行控制,控制我们的这个程序的结束,也就是这个时候已经读取到了这个文件内容的末尾;

2.4.4close的方法的介绍
这个close其实就是释放资源,这个是最直观的理解,这个具体是什么资源,其实就是我们的这个pcb里面的这个文件描述符表;
我们之前介绍过这个:每一个进程都是用这个PCB内核和我们的代码程序,而且这个进程是系统文件资源分配的基本单位;
文件描述符表:实际上是一个顺序表(数组)–但是这个数组的长度是有限的;我们每一次打开一个文件进行读取,这个表就会被分配一个数据元素,但是这个表的长度有限,当这个表全部被填满的时候,就会出现意想不到的情况,但是这个情况的发生实际上不是我们可以预想到的,因为这个实际上就是需要一定的过程对于这个文件描述符表进行填充的,因此我们使用完成,或者是读取结束的时候,需要关闭这个系统的文件的资源,防止出现上面的这个文件描述符表被填满的情况;
结合上面的这个解释,其实这个close就是对于这个文件描述符表进行释放的;
下面的这个就是我们在这个文件资源的读取结束的时候,加上这个reader.close方法对于这个系统的资源进行关闭,释放我们的这个进程占据的这个文件描述符表里面的这个资源;

2.4.5close的使用优化操作
上面的这个方法固然可以解决问题,但是这个方法还是存在问题的,我们需要对于上面的这个写法进行优化;
因为我们上面的这个对于文件里面的内容进行读取的时候,肯呢个会抛出异常,这个时候一旦抛出,这个进程就会被终止,因此这个时候就会退出程序,不会执行到我们下面的这个close方法的地方;
因此我们可以使用这个try-finally语句把这个异常抛出之后,还会执行到这个close方法的地方,因为我们的这个fanally里面的这个代码块的内容是一定会被执行的;

上面的这个方式不够优雅,我们还是可以继续进行优化操作的:
下面的这个try语句里面的这个写法就是有这个对象的创建,这个写法就是try with resource语法,这个好处就是我们的这个try里面的这个语句块的内容执行完毕的时候,这个就会自动进行这个close的操作;

但是上面的这个写法的要求就是我们的这个try后面的这个括号里面的这个参数就是需要实现我们的这个closeable接口,我们可以向底层追,可以看到这个Reader就是实现了这个closeable接口的;

2.4.6内容的写入
下面的这个创建的writer就是负责向我们指定这个文件里面去写入数据内容,写入到我们的这个指定的文件里面去,这个过程中需要进行异常的处理;
我们的这个write方法写入的时候会把之前的内容覆盖掉,因此我们可以加上这个true参数让这个写入的内容从文件的末尾开始书写;

下面的这个实际上就是在这个构造方法里面添加新的参数,这样就是进行的追加操作,而不会覆盖我们的文件里面已经存在的内容;

2.3字节流的操作===》二进制文件
对于这个字节流里面的这个数据的读取,我们的这个方法的参数是一个byte类型的数组,因此我们需要首先对于这个byte类型的数组进行创建;

下面的这个和上面的字符流的读取其实没有很大的区别:还是创建字符流对象,因为这个inputstream.read调用方法这个这个参数是bute类型的数组,因此我们时候选需要创建符合类型的这个数组;
把这个读取的内容放到这个buffer数组里面去,然后进行打印出来,这个地方是使用的16进制的形式进行的打印输出;

上面的这个是把这个文件里面的这个内容进行读取;下面的这个是OutputStream就是对于这个文件写入内容,我们使用的是这个write方法,但是可以看到这个方法的参数是int或者是这个byte类型的数组,因此我们无法直接把这个str字符串进行输出,而是需要进行类型的转换;

2.4一些其他的读取方式
这个里面的就是我们非常熟悉的scanner类和对象的相关的操作;
我们之前使用的这个scanner类创建的对象用来在这个屏幕上面进行输入,这个参数是这个system.in,这个参数其实就是我们的InputerStream这个类里面的;

下面的这个就是使用的这个scanner,只不过把这个参数换成我们自己创建的这个inputStream对象,这个时候我们的这个scanner就是从文件里面进行读取,而不是从这个输入框里面进行读取;
这个里面也是可以使用这个next方法对于这个文件后续的内容进行读取的;

2.5字节流字符流转换
下面的这个就是通过这个PrintStream这个类进行我们的字节流字符流之间的相互转换,然后向这个文件里面写入数据,这个可能会出现写入的内容积攒在这个缓冲区上面,因此我们需要进行写入之后使用这个flush方法进行刷新,这样我们才可以在我们的这个文件里面看到我们写入的内容;

3.练习程序:扫描指定的目录
制定扫描的目录,找到这个名称里面包含指定字符的文件,询问用户是否需要进行删除这个文件;
分析:其实就是让用户输入一个路径,我们对于这个路径里面的所有的文件一层一层的进行遍历,然后输入这个字符串,看看遍历的过程中这个路径对应的这个文件是不是包含我们的字符串,询问用户是不是进行删除;
1.列举目录下面的内容;
2.判断这个文件的类型;
3.确定是否进行删除;
4.scanDir用于对于这个指定的路径进行扫描,这个路径必须要是一个目录,这个时候我们需要进行判断;
5.checkDelete方法是查看这个文件的名称里面有没有我们的这个指定的字符串
package demo12;import java.io.File;
import java.util.Scanner;public class Test {public static void main(String[] args) {Scanner scanner=new Scanner(System.in);System.out.println("请输入想要扫描的路径:");String path=scanner.next();File rootPath = new File(path);//下面的这个是对于用户可能输入的异常的方法进行判断的if(!rootPath.isDirectory()){System.out.println("你输入的这个路径不正确");return;}System.out.println("请输入你想要查询的关键词");String word = scanner.next();scanDir(rootPath,word);}
@SuppressWarnings({"all"})private static void scanDir(File rootPath,String word){//1.列举出来这个目录下面的所有内容File[] files = rootPath.listFiles();if(files==null){return;}//下面的这个是使用的增强for的方法进行遍历的for(File f:files){System.out.println("当前扫描的这个文件就是:"+f.getAbsolutePath());if(f.isFile()){//查看这个目录名称上面是不是我们的这个单词,封装一个新的方法checkDelete(f,word);}else{//下面的这个实际上就是针对于我们的这个遍历的每一个元素// 再次调用这个方法去进行判断//这个其实就是一个不断的递归的过程scanDir(f,word);}}}
@SuppressWarnings({"all"})private static void checkDelete(File f,String word){if(!f.getName().contains(word)){//前面加上了!说明没有包含这个word我们直接返回即可return;}//打印日志:当前的这个遍历到的文件的具体的路径System.out.println("当前的这个文件是:"+f.getAbsolutePath()+"请确认是否需要删除");Scanner scanner = new Scanner(System.in);String choice = scanner.next();//这个说明用户是yes的,即我们可以进行删除if(choice.equals("Y")||choice.equals("y")){f.delete();System.out.println("删除完毕");}//只要是用户输入的其他内容,我们就不会进行删除else{System.out.println("取消删除");}}
}``相关文章:
JavaEE初阶---文件IO总结
文章目录 1.文件初识2.java针对于文件的操作2.1文件系统的操作---file类2.2文件内容的操作---流对象的分类2.4字符流的操作》文本文件2.4.1异常的说明2.4.2第一种文件内容的读取方式2.4.3第二种读取方式2.4.4close的方法的介绍2.4.5close的使用优化操作2.4.6内容的写入 2.3字节…...
10.28Python_pandas_csv
三、读取CSV文件 CSV(Comma-Separated Values,逗号分隔值,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本); CSV 是一…...
数据处理与可视化:pandas 和 matplotlib 初体验(9/10)
数据处理与可视化:pandas 和 matplotlib 初体验(9/10) 介绍 在如今的数据驱动时代,掌握数据处理与可视化是每个开发者和数据科学家不可或缺的技能。Python 拥有强大的数据处理库 pandas 和数据可视化库 matplotlib,它…...
鸿蒙学习总结
鸿蒙(HarmonyOS),做为国产自主研发设计的第一个操作系统,从开放测试以来一直备受关注。其纯血鸿蒙版(HarmonyOS NEXT)也于进日发布。过去的一段时间里,我站在一个移动开发者的角度对HarmonyOS进…...
如何修改文件创建时间?六个超简单修改方法介绍
怎么修改文件创建时间?在信息安全与隐私保护的领域里,每一个细节都可能成为泄露敏感信息的突破口。文件的创建时间,这个看似微不足道的数据点,实则可能蕴含着重要的时间线索,对于不希望被外界窥探其内容或来源的个人及…...
【MySQL 保姆级教学】内置函数(9)
内置函数 1. 日期函数1.1 日期函数的种类1.2 示例1.3 日期的转换 2. 字符串函数2.1 种类2.2 示例 3. 数学函数3.1 种类3.2 向上取整和向下取整3.3 示例 4. 其他函数4.1 查询当前用户/数据库4.2 ifnull(val1,val2)4.3 md5()函数4.4 password()函数 1. 日期函数 1.1 日期函数的种…...
华为大咖说丨如何通过反馈机制来不断优化大模型应用?
本文分享自时习知 作者:袁泉(华为AI数据工程专家)全文约3015字,阅读约需8分钟 大模型应用正式投入使用后,存在一个较为普遍的情况:在利用“大模型提升业务运营效率”的过程中,业务部门和IT团队…...
上海亚商投顾:沪指缩量震荡 风电、传媒股集体走强
上海亚商投顾前言:无惧大盘涨跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。 一.市场情绪 市场全天缩量震荡,三大指数集体收涨,北证50则跌超7%,超80只北交所个股跌逾…...
三磺酸-Cy3.5-羧酸在水相环境中表现良好,能够提高成像的清晰度和准确性
一、基本信息 中文名称:三磺酸-Cy3.5-羧酸,水溶性Cy3.5 羧基 英文名称:trisulfo-Cy3.5-carboxylic acid,trisulfo-Cy3.5-COOH,trisulfo-Cyanine3.5-COOH 分子式:C41H44N2NaO11S3- 分子量:85…...
国标GB28181视频平台EasyGBS国标GB28181软件实现无需插件的视频监控对讲和网页直播
在当今社会,视频监控已经成为公共安全、企业管理、智能城市建设等领域不可或缺的一部分。然而,由于不同厂家和平台之间的兼容性问题,视频监控系统的联网和整合面临巨大挑战。为了解决这个问题,国家制定了《公共安全视频监控联网系…...
mac nwjs程序签名公证(其他mac程序也一样适用)
为什么需要公证 mac os14.5之后的系统,如果不对应用进行公证,安装,打开,权限使用上都会存在问题,而且有些问题你强制开启(sudo spctl --master-disable)使用后可能会有另外的问题, …...
网络应用技术 实验一:路由器实现不同网络间通信(华为ensp)
目录 一、实验简介 二、实验目的 三、实验需求 四、实验拓扑 五、实验任务及要求 1、任务 1:完成网络部署 2、任务 2:设计全网IP 地址 3、任务 3:实现全网主机互通 六、实验步骤 1、在ensp中部署网络 2、配置各主机 IP地址、子网掩…...
使用 Qt GRPC 构建高效的 Trojan-Go 客户端:详细指南
使用 Qt GRPC 构建高效的 Trojan-Go 客户端:详细指南 初识 Qt 和 gRPC 什么是 Qt?什么是 gRPC? 项目结构概述创建 proto 文件定义 API 下载 api.proto 文件解析 proto 文件 1. package 与 option 语句2. 消息类型定义 TrafficSpeedUserUserSt…...
【mysql进阶】5-事务和锁
mysql 事务基础 1 什么是事务 事务是把⼀组SQL语句打包成为⼀个整体,在这组SQL的执⾏过程中,要么全部成功,要么全部失败,这组SQL语句可以是⼀条也可以是多条。再来看⼀下转账的例⼦,如图: 在这个例⼦中&a…...
指增和中性产品的申赎加减仓及资金调拨自动化伪代码思路
定义一些关键字代表的意义 STRUCT: 代表需要输入的格式化的信息IMPORT: 代表需要输入的外部信息, 这些信息通常是客观的SEARCH: 需要从某地比如数据库检索搜集信息SUM: 一种宏观的加和操作, 比如两个股票户ABAB,微观上实际还是有差异GROUP: …...
【论文分享】居住开放空间如何影响老年人的情感:使用可穿戴传感器的现场实验
本研究首次通过跟踪实时、高分辨率的环境暴露和情绪反应来研究和比较不同质量住宅社区中的居住开放空间(ROS)与老年人情绪之间关联;并采用混合方法,包括可穿戴传感器和问卷调查,收集了中国广州老年居民的客观和主观住宅…...
入门 | Prometheus+Grafana 普罗米修斯
#1024程序员节|征文# 一、prometheus介绍 1、监控系统组成 一个完整的监控系统需要包括如下功能:数据产生、数据采集、数据存储、数据处理、数据展示、分析、告警等。 (1)、数据来源 数据来源,也就是需要监控的数据…...
制作Ubuntu根文件系统
制作Ubuntu根文件系统: gunzip ubuntu-base-22.04.5-base-arm64.tar.gz mkdir ubuntu tar xvpf ubuntu-base-22.04.5-base-arm64.tar -C ubuntu 挂载目录、复制dns、执行chroot cd /userdisk/ubuntu cp /etc/resolv.conf ./etc/resolv.conf mount --bind /dev ./d…...
16个最佳测试管理工具(2024)
1、前言 测试管理解决方案能够帮助你捕捉测试需求、设计测试用例、生成测试执行报告、管理资源等。软件质量的疏忽可能导致公司遭受巨大的经济损失、声誉损害或面临诉讼风险。一个优秀的测试管理工具是防止缺陷和故障进入生产环节的关键。 2、PractiTest 功能特点&#x…...
基于知识图谱的猕猴桃种植技术问答系统
猕猴桃怎么种植更高效、病虫害怎么防治、最适宜的气候条件有哪些?作为一名科技研发迷,这些问题是不是听起来很有挑战性?咱们今天就来聊聊一个特别的研发项目——基于知识图谱的猕猴桃种植技术问答系统。这不仅仅是一个农业项目,它…...
使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...
TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...
Python 包管理器 uv 介绍
Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...
Linux离线(zip方式)安装docker
目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1:修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本:CentOS 7 64位 内核版本:3.10.0 相关命令: uname -rcat /etc/os-rele…...
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问(基础概念问题) 1. 请解释Spring框架的核心容器是什么?它在Spring中起到什么作用? Spring框架的核心容器是IoC容器&#…...
人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式
今天是关于AI如何在教学中增强学生的学习体验,我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育,这并非炒作,而是已经发生的巨大变革。教育机构和教育者不能忽视它,试图简单地禁止学生使…...
Vite中定义@软链接
在webpack中可以直接通过符号表示src路径,但是vite中默认不可以。 如何实现: vite中提供了resolve.alias:通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...
React从基础入门到高级实战:React 实战项目 - 项目五:微前端与模块化架构
React 实战项目:微前端与模块化架构 欢迎来到 React 开发教程专栏 的第 30 篇!在前 29 篇文章中,我们从 React 的基础概念逐步深入到高级技巧,涵盖了组件设计、状态管理、路由配置、性能优化和企业级应用等核心内容。这一次&…...
32位寻址与64位寻址
32位寻址与64位寻址 32位寻址是什么? 32位寻址是指计算机的CPU、内存或总线系统使用32位二进制数来标识和访问内存中的存储单元(地址),其核心含义与能力如下: 1. 核心定义 地址位宽:CPU或内存控制器用32位…...
