一、文件IO
1.0基本了解
狭义的文件:保存在硬盘上的文件
广义的文件:操作系统进行资源管理的一种机制 很多软件/硬件资源 抽象成''文件''来进行表示
(咱们主要是谈 狭义的文件)

2.0如何区分或者识别一个文件
我们学习二叉树的时候 了解到计算机中 目录套目录 构成了树形结构
从树根开始 到最终的文件 中间都需要经过哪些目录 把这些目录记录下来,就构成了”路径:
一般使用/来分割路径中的多级目录(/斜杠 \反斜杠) 反斜杠容易产生转义问题
绝对路径: 从盘符(根节点)开始 逐级表示出来
相对路径:需要明确一个“基准路径”

下面是相对路径在编译器中的表现:

3.0 文件的种类
从开发角度 把文件分成两类 一类是文本文件 一类是二进制文件(其实都是二进制文件)
文本:二进制数据组合刚好能构成字符(不仅仅是ascii)
二进制数据恰好都能在码表上能够查到 并且翻译过来的字符能构成有意义的信息
实际开发中判断某个文件是否是文本文件:直接用记事本打开 打开后不是乱码 能看懂就是
图片 音频 视频 可执行程序 都是典型的二进制文件
二、 操作文件的一些 类
Java标准库提供了一系列的类操作文件
不需要背会(给自己建立一个索引就够了)这里介绍8个 分为两类:
#文件操作系统 : 创建文件 删除文件 重命名 创建目录
#文件内容操作 : 针对一个文件的内容进行读和写
1.0文件操作系统
File类 用来操作文件系统
File对象的创建
File file = new File(" 一个路径");
下面统一介绍各种方法:


deletOnExit()进程结束之后再删除
list()方法
list() String[ ] list = file.list(); System.out.println(list);
list只是列出当前目录里面的子元素 无法列出目录中的内容
mkdir()方法
创建目录 mk= make dir=directory mkdirs()是创建多级目录
2.0 文件内容操作(流对象)
(1)基本了解
Java中针对文件内容的操作 主要是通过一组“流对象“来实现的
流 :类似流水的感觉 接100ml的水 可以一次接10ml接10次 也可以一次接1ml接100次
计算机中的读取数据也可以类似这样的流 一次读取一个字节 100次等
Java中提供了一组类 表示流~ 几十个 非常多 这里讲解其中的8个
分为两个大的类别
字节流 读写文件 以字节为单位 是针对二进制文件使用的
InputStream 输入 OutputStream 输出
字符流 读写文件 以字符为单位 是针对文本文件使用的
Reader 输入 Writer输出
Java中其他的流对象都是直接或者间接继承自这个类
输入:从文件读数据 输出:往文件写数据
判断:在cpu上 迎面走来是是输入 离你而去是输出
数据从硬盘到CPU 是输入 数据从CPU到硬盘 是输出
(2) 具体的方法
InputStream等四兄弟是抽象类 不能进行实例化 需要new它的子类
FileInputStream()
InputStream inputStream = new FileInputStream ( "路径") ; 路径也可以是File对象
创建对象操作一旦成功 就是相当于打开文件 先打开 然后才能读写这是操作系统定义的流程
inputStream.close( )关闭文件
咱们需要手动释放 否则引起 文件资源泄露 在进程的PCB里面有一个文件描述符表
每次程序打开一个文件 就会在文件描述附表中申请一个表项(占个坑)如果光打开 不关闭 就会使这里的文件描述符表 表项耗尽 后续再次打开 就会打开失败 后续的很多逻辑就bug了
try(InputStream inputStream = new FileInputStream ("路径");
只要出了try代码块 就会自动调用close
OutputStream()
对于OutputStream来说 默认情况下会尝试创建不存在的文件
是会清除上次的文件内容的 打开文件的一瞬间 上次的文件就清空了
追加写的模式 避免清空(append 追加写)
read()方法

返回值是int 不是byte 此处是为了可以使用-1表示读取完毕~ 如果读到末尾就返回一个负1
一次读若干个字节 读取到的数据放到参数b中 有非常大的数组 每次读操作都把数据放到数组的某个部分 使用这个版本~
read 返回的相当于是一个char 两个字节 但是前面使用字节流读取的时候 是3个字节
字符流和字节流的两个代码 都是对的 不矛盾的~
字节流读到的是文件中的原始数据 字符流在读取的时候 就会根据文件的内容编码格式 进行解析

转码当然是有开销的 字节流比字符流快 确实也毋庸置疑
执行快? ---> 运行效率高 代码写的快? ---> 开发效率高
取决于你的文件是文本文件还是二进制文件~
Write()方法

一次写一个字节 一次写若干个字节
3.0 流对象
(1)使用流程
先打开 再读写 最后关闭
应该使用哪个流对象? 先区分文件是文本文件还是二进制文件 再区分读还是写~
(2)缓冲区
通常就是一段内存空间 用来提高程序的效率
直接读写硬盘 是比较低效的 因此有的时候 就希望减少读写文件次数
攒一波 再一起写 或者读的时候 也不是一个一个的读 一次读一批数据 到缓冲区 再慢慢解析
想要提高代码的效率:
写代码的时候 手动创建缓冲区(byte数组) 手动减少read write次数
使用标准库提供了 ”缓冲区流“ BufferedStream 把InputStream之类的对象套上一层
4.0 案例
(1)扫描指定目录 并找到名称中包含指定字符的所有普通文件(不包含目录) 并且后续询问用户是否要删除文件
也就是遍历目录 本质上就等同于二叉树遍历

(2)进行普通文件的复制
复制就是把文件里的每个字节 都读出来 写入到另一个文件中

(3)扫描指定目录 并找到名称或者内容中包含指定字符的所有普通文件(不包含目录)
String rootPath = scanner.next(); nextLIne必须读到\n才结束 next读取到空白符就结束
感谢大家的支持

更多内容还在加载中...........![]()
如有问题欢迎批评指正,祝大家生活愉快、学习顺利!!!
1675

被折叠的 条评论
为什么被折叠?



