java进阶学习—IO流

一、IO概述:

(1)数据写到文件中,实现数据永久化存储

(2)读取文件中已经存在的数据

4c7bf148250e4b73839999d10e897b6b.png

1、I:硬盘的数据读取到内存

2、O:内存的数据写入到硬盘

3、IO流分类:

(1)按流向分:输入流、输出流

(2)按数据类型分:字节流、字符流

二、字节流:操作所有类型的文件(包括音频、视频)

1、字节流写数据步骤:

(1)创建字节输出流对象

notes:文件不存在就创建、文件存在就清空

(2)写数据

note:写出的整数实际是整数在码表上对应的字母

(3)释放资源

note:每次使用完流必须要释放资源,close()实现

2、字节流写数据3种方式

91a391aeb1ca4631a4443a1a9c4ca52f.png

3、字节流写数据练习

(1)写数据3种方式练习

60f75c3ec567441fa713ac420b594207.png 

1313442c45ae4f4d9a203090068ccbff.png

461a73ef28064cc0b5ee0974a8e20df5.png 

f14f5e157e714b6b8953965ed2166c92.png

 (2)实现数据换行

note:\r\n.getBytes()实现换行适用于window系统,同理 \n适用于Linux系统,\r适用于Mac系统

69ed9a78886848849e6bfdcbdc2ce314.png 

(3)实现续写功能,让文件原有内容不被覆盖

字节输出流方法:public FileOutputStream(String,boolean append),第二个参数为true表示续写开启,默认状态下是false

143f8ef4484043f990ca16a5611191f1.png 

(4)字节流中异常的捕获(try...catch...)

往文件写入数据时,存在写入的数据类型有误以及写入数据为空两个问题,此时需要捕获异常并解决,采用try...catch...finally方式

9b9b1956841d4eaf9cdf07d19bc0d5bf.png 

note:异常处理时,finally来执行所有清除操作。被finally控制的语句一定会执行,除非JVM退出

4、字节流读数据

方法read()一次读取一个字节,通过char强制转换可得文件内容。通过while循环读取全部数据

(1)字节流读取数据练习(单个读取、多个读取)

304452a77ec24c0681ac8550fe24a5c3.png

6d18e31b8fad4f6fb0d13055abe18db5.png 

3b737eee9ccc4df5a1098557596a202e.png

5、字节流拷贝文件:输入流读取数据,输出流写入已读取的数据,创建字节数组可提高读取效率

 (1)文件拷贝练习(挨个字节读取拷贝/字节数组读取拷贝)

note:利用方法public int read(byte []arr){}:表示输入流一次读取arr.length个字节的数据,返回的是读入缓冲区的总字节数,即实际读取的字节个数

b6717408f1784c778ccf83c2fda2f0c4.png

(2)文件拷贝原理图

bef2885d6ada488fa3091f454ecfd2fc.png

957763f84cd441b6a7d77f2afbd331fb.png

三、字节缓冲流

1、缓冲流

BufferedOutputStream:字节缓冲输出流

BufferedInputStream:字节缓冲输入流

2、构造方法

BufferedOutputStream(OutputStream out)

BufferedInputStream(InputStream in)

note:字节缓冲流仅仅提供缓冲区,真正读写数据的是字节流对象

(1)字节缓冲流拷贝文件

4e9baccea09b454785efd0246437c665.png

 (2)字节缓冲流拷贝文件原理图

e90a88188bd04cec8e79d9cbd8325a4e.png

四、字符流:操作纯文本文件

1、编码表

  • 计算机储存的信息都用二进制数表示
  • 字符变成二进制再存储到计算机中称为编码
  • 将计算机存储的二进制数解析出来称为解码
  • 解码和编码方式一致
  • ASCII字符集:包括数字、大小写字符、常见标点符号
  • GBK:window系统默认码表:兼容ASCII、包含中文、一个中文占两个字节
  • 万国码Unicode码表:最常用的编码规则为UTF-8,一个中文占三个字节(idea使用)
  • note:字节流读取中文时,一次读一个字节,GBK和UTF-8中一个中文都是多个字节,字节流每次读取一部分,出现乱码

(1)汉字存储和展示过程解析

759a48a5cae54f28be7758f4c4a8dc88.png

2、字符串的编码和解码

编码:

  • byte [] getBytes():使用平台的默认字符集将String编码为字节,结果存储到新字节数组中
  • byte [] getBytes(String charsetName):使用指定字符集将String编码为字节,结果存储到新字节数组中

解码:

  • String(byte [] bytes):平台的默认字符集解码指定字节数组构造新的String
  • String(byte [] bytes,String charsetName):使用指定字符集解码指定字节数组构造新的String

(2)编码、解码练习

90f4beab84fa4e85a76bdb1d73ee26e3.png 

3、字符流读取中文:字节流+编码表

note:任意码表中,中文的第一个字节为负数

4、小结

  • 文件拷贝:使用字节流/字节缓冲流
  • 文本文件数据读取到内存:字符输入流
  • 内存数据写到文本文件中:字符输出流

5、字符流写数据步骤

(1)创建字符输出流对象

notes:文件不存在就创建、文件存在就清空

(2)写数据

note:写入int类型整数时,实际写出整数在码表上对应的字母;写入字符串数据,即原样写出

(3)释放资源

note:每次使用完流必须要释放资源,close()实现

6、字符流写数据5种方式

8ed01afe6f6843fb841d27dee21be01c.png

note:flush和close方法

2369c6a9b41940e795af802d861fbf31.png

(3)字符流写数据练习

ff1a73d7e41147f9bde0ff9b8c3724f7.png 

e93dd324c75249db91f56a9521f91fc6.png 

 8bab71c1973a49f6992a518158927dbe.png

1b76357dd53f44e6bb691935bcaf703c.png

1a0bbe1b5ff74c6da047e233e660f74d.png  

note:close方法关闭流,无法再写入数据,flush方法刷新流,可继续写入数据

7、字符流读数据:read方法

(1)字符流读取数据练习(单个读取、多个读取)

58b8ece8f3534126af128eb894aeb162.png

87e77c6f9c1c4fa385826655351f523f.png 

69fc992d18374b1ab63c634559119c72.png

(2)字符流保存键盘录入数据练习

4299123f017143a6810cc3ad131db66a.png

eb0b57c0802b4875a2ad03971bc3fc2d.png

27ea2a95cfb240a4aae68f7d0fa293a4.png 

五、字符缓冲流

1、缓冲流

BufferedReader:字符缓冲输出流

BufferedWrite:字符缓冲输入流

(1)字符缓冲流读取数据练习(多个读取,BufferedReader特有方法:readLine方法可以读取一整行数据,自动换行)

0bba22f58fa84e04865ff0271cc27481.png

7a85104665134c79acb247e36d96e2ea.png

(2)字符缓冲写入数据练习(BufferedWrite特有方法:newLine方法,换行写入)

affc67b1d941472eb460f1ec8ca19b1d.png

(3)读取本地文件数据转换为数组重新输入练习

c6f6a9d305dc4264a14d2d2f508d155b.png

7ec49742122f44d3a445069ad439debb.png 

六、字节流、字符流、缓冲流小结

43fc65c83969459a850528be7c34c0ee.png

七、转换流(JDK11之前指定编码读写,之后被字符流中的新构造FileReader取代)

  • IntputStreamReader:字节流转为字符流输入
  • OutputStreamWriter:字符流转换为字节流输出

918b0e3bd65448a7a4dc94710ca0c9ce.png

(1)转换流练习

debde1ed460f438b83766fffb0b201da.png

fb78fd808a774a0db49173692602f16a.png 

八、对象操作流

问题引入:把对象存储到本地文件可以采用如下方式

(1)创建类

5e4cc6cb2a984254a416dcf5df88a779.png

(2)写入文件

9e91424bf57f4e548ad6cb1614b67c98.png

b0e2c6b580f74603b7e293197f6f4793.png 

上述写入存在问题:只要打开def文件学生信息很直观展示,不够安全

1、对象操作流特点:可以把对象以字节形式写到本地文件,直接打开文件读不懂,依赖对象操作流读到内存中

2、对象操作流:

  • ObjectIntputStream:对象操作输入流(对象序列化流)-----将对象写到本地文件中
  • ObjectOutputStream:对象操作输出流(对象反序列化流)-----把写到本地文件中的对象读取到内存,或接收网络中传输的对象

3、对象操作流需要传入字节流(FileInputStream、FileOutputStream)

€1 对象操作流实现序列化

3a1b2868e47049d38be944c8763af273.png

直接写入遇阻,原因以及解决如下:

ff10ef21045549d88c61f869f2de76a3.png 

cc284b0278664d5ebe0c7a4c93927088.png 

df6a5a1fb1a141f197d9e7e4e5269115.png 

73c3abc070fa479aafdfb0469833592c.png 

€2 对象操作流实现反序列化

c80e7e2415bb44f7aba11de0e403cc19.png

db2d2fb648ed4b6d95066e918795cb0f.png 

€3 序列化完成后,修改类,此时读取文件出现问题

(1)当完成序列化后修改对象所属的类,会抛出InvalidClassException异常

(2)解决办法:给对象所属类加一个seriaVersionUID(可以通过ArrayList中复制得到)

(3)类中某个成员变量的值不想被序列化

(4)解决办法:给该成员变量加关键字transient修饰,该成员变量不参与序列化过程

代码如下:

356169f8a1c34026bfa06ea1a9289694.png

25fb0a5238714feba9526812b5923725.png 

045a8a7554364c1b8832ff266bf96509.png 

错误原因:

53eb738e4b0143748fcd73251d676708.png 

解决方法:在类中添加一个serialVersionUID,保证后续类发生变动时 ,serialVersionUID是不变的

c5862cc5172c4bb8a8ee147406736bed.png

transient关键字使用:

b1f098c49a8e434183c8187c39530c70.png 

€4 对象操作流读写多个对象练习

(1)数组做容器,写入读取对象数据(note:Student类中重写了toString方法,打印对象展示的是对象属性)

c56c6de22fdf470ebd664f7a9c7b569b.png

e087afd0d3874a03b74887699f425739.png

83914229e5b346efb4ef117d99c3f5ec.png 

000e4535e17c429e91ec65a6db736917.png 

(2)集合容器,写入读取

d0b7607881024409a419b00155c184af.png 

d0b0c6bd0aff4cd58cd0fc68871d6c88.png

九、Properties

1、概述:

  • 是一个Map体系的集合类
  • Properties中有跟IO相关的方法
  • 键值对的数据类型基本定义为字符串

2、Properties作为集合的特有方法

3cae2c998e764acbacd0b4e5c6229434.png

 €5 Properties集合中的常用增删改查及遍历练习(put(键值对)、remove(key)、put(键值对)、get(key)、keySet()、entrySet())

eef3efcb576948beb630341bde46bd6f.png

3f9f290499184e7c90569ec94f24aa4f.png 

8316e811f1ee491db86f2f1674f1721c.png 

€6 Properties中的特有方法练习(setProperty(key,value)、getProperty(key)、stringPropertyNames())

fe36a23f233640ef986b1ab16060b78a.png

24d52b9d9b274ba18aa17fc37e543b1e.png 

3、Properties与IO结合的方法

e07079f7ed5049d595571ea9b53cab41.png

4、Properties主要与Filewriter喝FileReader结合使用

€7 Properties与IO结合的方法练习使用(load(fr)、store(fw,null))

(1)读取文件数据

1fb9b69cfe124a58bf91a0a23f597965.png

ae916c6c5aa54ac9b61b2e1944ea0c4d.png 

494208c281cd496dbcb42d86a89c2db5.png

(2)写入数据 

c2a75df6884043e0a542fc323115f365.png 

b4f0ca2abdc949b69defe4251fbc4dfd.png 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值