JavaEE初阶6.0

一、文件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读取到空白符就结束

感谢大家的支持

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

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

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值