一、文件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()方法

为了可以启用-1表示读取完毕~ 如果读到末尾就返回一个负1就是返回值是int 不是byte 此处

一次读若干个字节 读取到的材料放到参数b中 有十分大的数组 每次读操作都把数据放到数组的某个部分 使用这个版本~

3个字节就是read 返回的相当于是一个char 两个字节 但是前面使用字节流读取的时候

字符流和字节流的两个代码 都是对的 不矛盾的~

字节流读到的是记录中的原始数据 字符流在读取的时候 就会根据记录的内容编码格式 进行解析

转码当然是有开销的 字节流比字符流快 确实也毋庸置疑

执行快? ---> 运行效率高 代码写的快? ---> 开发效率高

二进制记录~就是取决于你的文件是文本文件还

Write()途径

一次写一个字节 一次写若干个字节

3.0 流对象
(1)使用流程

先打开 再读写 结果关闭

应该使用哪个流对象? 先区分文件是文本文件还是二进制文件 再区分读还是写~

(2)缓冲区

通常就是一段内存空间 用来提高程序的效率

直接读写硬盘 是比较低效的 因此有的时候 就希望减少读写文件次数

攒一波 再一起写 或者读的时候 也不是一个一个的读 一次读一批数据 到缓冲区 再慢慢解析

想要提高代码的效率:

写代码的时候 手动创建缓冲区(byte数组) 手动减少read write次数

应用标准库提供了 ”缓冲区流“ BufferedStream 把InputStream之类的对象套上一层

4.0 案例
否要删除文件就是(1)扫描指定目录 并找到名称中包含指定字符的所有普通材料(不包含目录) 并且后续询问用户

也就是遍历目录 本质上就等同于二叉树遍历

(2)进行普通记录的复制

把文件里的每个字节 都读出来 写入到另一个文件中就是复制就

(3)扫描指定目录 并找到名称或者内容中包含指定字符的所有普通资料(不包括目录)

String rootPath = scanner.next(); nextLIne必须读到\n才结束 next读取到空白符就结束

感谢大家的承受

更多内容还在加载中...........

如有疑问欢迎批评指正,祝大家生活愉快、学习顺利!!!