Java基础学习Day13--IO流


今天公司还是没什么业务
感觉快被裁了
今天学习了java的io相关内容


一、IO流概述

1.概念

流:是一抽象概念,是对数据传输的总称。也就是说数据在设备间的传输称为流。更具体一点,是内存与存储设备之间传输数据的通道。

IO流:对于数据的传输,可以看做是一种数据的流动,按照流动的方向,以内存为基准,分为输入input 和输出output,即流向内存是输入流,流出内存的输出流。

Java中I/O操作主要是指使用java.io包下的内容,进行输入、输出操作。输入也叫做读取数据,输出也叫做作写出数据。

2.流的分类

(1)按方向分
输入流: 将 < 存储设备 > 中的内容读入到 < 内存 > 中。
输出流: 将 < 内存 > 中的内容写入到 < 存储设备 > 中。
(2)按单位分
字节流: 以字节为单位, 可以读写所有数据。
字符流: 以字符为单位, 只能读写文本数据。

二、IO流四大家族首领

1.字节流

java.io.InputStream 字节输入流
java.io.OutputStream 字节输出流

2.字符流

java.io.Reader 字符输入流
java.io.Writer 字符输出流

3.注意:

(1)四大家族的首领都是抽象类。(abstract class)
(2)所有的流都实现了:
java.io.Closeable接口,都是可关闭的,都有 close() 方法。
流是一个管道,这个是内存和硬盘之间的通道,用完之后一定要关闭,不然会耗费(占用)很多资源。养成好习惯,用完流一定要关闭。
(3)所有的输出流都实现了:
java.io.Flushable接口,都是可刷新的,都有 flush() 方法。
养成一个好习惯,输出流在最终输出之后,一定要记得flush()刷新一下。这个刷新表示将通道/管道当中剩余未输出的数据强行输出完(清空管道!)刷新的作用就是清空管道。如果没有flush()可能会导致丢失数据。
(4)在java中只要“类名”以 Stream 结尾的都是字节流。以“ Reader/Writer ”结尾的都是字符流。

三、字节流

1. 字节流抽象基类

在这里插入图片描述

2.InputStream:字节输入流的所有类的超类

在这里插入图片描述

3.OutputStream:字节输出流的所有类的超类

在这里插入图片描述

4.字节流写数据

(1)基本步骤
创建FileOutputStream对象,关联到一个文件路径
调用write()方法,写出数据
调用close()方法,释放资源
打开文件,查看内容
(2)三种方式
write(int b) 一次写一个字节数据
write(byte[] arr) 一次写一个字节数组
write(byte[] arr,int index,int len) 写字节数组的一部分
(3)两个问题
①如何写换行
调用write()方法,写出”\r\n”.getBytes()即可

②如何文件续写
使用FileOutputStream(String name,boolean append)构造方法
构造方法中第二个参数传递true,则在文件末尾继续写数据
(4)异常处理
字节流写数据同时处理异常的重要步骤
将创建字节流对象和写出数据的代码放在try中
在catch中捕获IOException异常
在finally中进行释放资源

5.字节缓冲流

(1)基本分类&概述
①BufferedOutputStream
类实现缓冲输出流。 通过设置这样的输出流,应用程序可以向底层输出流写入字节,而不必为写入的每个字节导致底层系统的调用

②BufferedInputStream
创建BufferedInputStream将创建一个内部缓冲区数组。 当从流中读取或跳过字节时,内部缓冲区将根据需要从所包含的输入流中重新填充,一次很多字节

(2)构造方法
| BufferedOutputStream(OutputStream out) | 创建字节缓冲输出流对象 |

| BufferedInputStream(InputStream in) | 创建字节缓冲输入流对象 |

四、字符流

1. 概念

由于字节流操作中文不是特别的方便,所以Java就提供字符流
字符流 = 字节流 + 编码表 (补充):中文的字节存储方式

用字节流复制文本文件时,文本文件也会有中文,但是没有问题,原因是最终底层操作会自动进行字节拼接成中文,如何识别是中文的呢?

汉字在存储的时候,无论选择哪种编码存储,第一个字节都是负数

2.分类

(1)字符流体系图
在这里插入图片描述

(2)字符输入流(Reader)

在这里插入图片描述

(3)字符输出流(Writer)
在这里插入图片描述

3.字符缓冲流

(1)概念
①BufferedWriter
将文本写入字符输出流,缓冲字符,以提供单个字符,数组和字符串的高效写入,可以指定缓冲区大小,或者可以接受默认大小。默认值足够大,可用于大多数用途。

②BufferedReader
从字符输入流读取文本,缓冲字符,以提供字符,数组和行的高效读取,可以指定缓冲区大小,或者可以使用默认大小。 默认值足够大,可用于大多数用途。

(2)构造方法
| BufferedWriter(Writer out) | 创建字符缓冲输出流对象 |
| BufferedReader(Reader in) | 创建字符缓冲输入流对象 |
(3)字符缓冲流特有功能
void newLine()写一行行分隔符,行分隔符字符串由系统属性定义

String readLine()读一行文字。 结果包含行的内容的字符串,不包括任何行终止字符如果流的结尾已经到达,则为null

五、序列化

1.对象序列化流

对象序列化流( ObjectOutputStream):

将Java对象的原始数据类型和图形写入OutputStream。 可以使用ObjectInputStream读取(重构)对象。 可以通过使用流的文件来实现对象的持久存储。 如果流是网络套接字流,则可以在另一个主机上或另一个进程中重构对象 。

构造方法:
ObjectOutputStream(OutputStream out)
创建一个写入指定的OutputStream的ObjectOutputStream。

序列化对象的方法:
void writeObject(Object obj)
将指定的对象写入ObjectOutputStream。

2.对象反序列化流

对象反序列化流(ObjectInputStream):
反序列化先前使用ObjectOutputStream编写的原始数据和对象。

构造方法:
ObjectInputStream(InputStream in)
创建从指定的InputStream读取的ObjectInputStream

反序列化对象的方法:
Object readObject()
从ObjectInputStream读取一个对象

3.serialVersionUID&transient

(1)serialVersionUID
用对象序列化流序列化了一个对象后,假如我们修改了对象所属的类文件,读取数据会不会出问题呢?

会出问题,会抛出InvalidClassException异常。

如果出问题了,如何解决呢?
①重新序列化
②给对象所属的类加一个serialVersionUID
private static final long serialVersionUID = 42L;

transient
如果一个对象中的某个成员变量的值不想被序列化,又该如何实现呢?
给该成员变量加transient关键字修饰,该关键字标记的成员变量不参与序列化过程

4.集合(Properties集合)

(1)概念:是一个Map体系的集合类
Properties可以保存到流中或从流中加载
属性列表中的每个键及其对应的值都是一个字符串
(2)Properties作为Map集合的特有方法
①Object setProperty(String key, String value)
设置集合的键和值,都是String类型,底层调用 Hashtable方法 put
②String getProperty(String key)
使用此属性列表中指定的键搜索属性
③Set stringPropertyNames()
从该属性列表中返回一个不可修改的键集,其中键及其对应的值是字符串
(3)Properties和IO流相结合的方法
①void load(InputStream inStream):从输入字节流读取属性列表(键和元素对)
②void load(Reader reader):从输入字符流读取属性列表(键和元素对)
③void store(OutputStream out, String comments):将此属性列表(键和元素对)写入此 Properties表中,以适合于使用load(InputStream)方法的格式写入输出字节流
④void store(Writer writer, String comments):将此属性列表(键和元素对)写入此 Properties表中,以适合使用load(Reader)方法的格式写入输出字符流


明天会更好

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TonyLiuys

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值