[Java基础] IO进阶

​写在前面

使用字符流读取中文不会乱码,原因是什么?那么如果读取的文件编码与代码编码不一致怎么办?

如何把Java对象进行长久保存?

下面开始今日的学习。

活动地址:CSDN21天学习挑战赛

学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。各位小伙伴,如果您:
想系统/深入学习某技术知识点…
一个人摸索学习很难坚持,想组团高效学习…
想写博客但无从下手,急需写作干货注入能量…
热爱写作,愿意让自己成为更好的人…

概览

字节流读取中文输出会存在什么问题?

        会乱码。或者内存溢出。

读取中文输出,哪个流更合适,为什么?

        字符流更合适,最小单位是按照单个字符读取的。

文件字符输入流:Reader

作用:以内存为基准,把磁盘文件中的数据以字符的形式读取到内存中去。

构造器

说明

public FileReader​(File file)

创建字符输入流管道与源文件对象接通

public FileReader​(String pathname)

创建字符输入流管道与源文件路径接通

方法名称

说明

public int read()

每次读取一个字符返回,如果字符已经没有可读的返回-1

public int read(char[] buffer)

每次读取一个字符数组,返回读取的字符个数,如果字符已经没有可读的返回-1

 字符输入流- 一次读取一个字符数组

 文件字符输入流:FileReader

作用:以内存为基准,把磁盘文件中的数据以字符的形式读取到内存中去。

方法名称

说明

public int read()

每次读取一个字符返回,如果字符已经没有可读的返回-1

public int read(char[] buffer)

每次读取一个字符数组,返回读取的字符数,如果字符已经没有可读的返回-1

字符输出流

 文件字符输出流:FileWriter

作用:以内存为基准,把内存中的数据以字符的形式写出到磁盘文件中去的流。

构造器

说明

public FileWriter(File file)

创建字符输出流管道与源文件对象接通

public FileWriter​(File file,boolean append)

创建字符输出流管道与源文件对象接通,可追加数据

public FileWriter​(String filepath)

创建字符输出流管道与源文件路径接通

public FileWriter​(String filepath,boolean append)

创建字符输出流管道与源文件路径接通,可追加数据

 文件字符输出流(FileWriter)写数据出去的API

方法名称

说明

void write​(int c)

写一个字符

void write​(char[] cbuf)

写入一个字符数组

void write​(char[] cbuf, int off, int len)

写入字符数组的一部分

void write​(String str)

写一个字符串

void write​(String str, int off, int len)

写一个字符串的一部分

流的关闭与刷新

方法

说明

flush()

刷新流,还可以继续写数据

close()

关闭流,释放资源,但是在关闭之前会先刷新流。一旦关闭,就不能再写数据

缓冲流

缓冲流概述 

缓冲流也称为高效流、或者高级流。之前学习的字节流可以称为原始流。

作用:缓冲流自带缓冲区、可以提高原始字节流、字符流读写数据的性能

字节缓冲流性能优化原理:

字节缓冲输入流自带了8KB缓冲池,以后我们直接从缓冲池读取数据,所以性能较好。

字节缓冲输出流自带了8KB缓冲池,数据就直接写入到缓冲池中去,写数据性能极高了。

字节缓冲流  

字节缓冲输入流:BufferedInputStream,提高字节输入流读取数据的性能。  

字节缓冲输出流:BufferedOutputStream,提高字节输出流读取数据的性能。

构造器

说明

public BufferedInputStream​(InputStream is)

可以把低级的字节输入流包装成一个高级的缓冲字节

输入流管道,从而提高字节输入流读数据的性能

public BufferedOutputStream​(OutputStream os)

可以把低级的字节输出流包装成一个高级的缓冲字节

输出流,从而提高写数据的性能

字符缓冲输入流

字符缓冲输入流:BufferedReader。

作用:提高字符输入流读取数据的性能,除此之外多了按照行读取数据的功能。

构造器

说明

public BufferedReader​(Reader r)

可以把低级的字符输入流包装成一个高级的缓冲字符输入流管道,从而提高字符输入流读数据的性能

字符缓冲输入流新增功能

方法

说明

public String readLine()

读取一行数据返回,如果读取没有完毕,无行可读返回null

字符缓冲输出流  

字符缓冲输出流:BufferedWriter。  

作用:提高字符输出流写取数据的性能,除此之外多了换行功能

构造器

说明

public BufferedWriter​(Writer w)

可以把低级的字符输出流包装成一个高级的缓冲字符输出流管道,从而提高字符输出流写数据的性能

字符缓冲输出流新增功能

方法

说明

public void newLine()

换行操作

1、之前我们使用字符流读取中文是否有乱码?

        没有的,因为代码编码和文件编码都是UTF-8。

2、如果代码编码和文件编码不一致,使用字符流直接读取还能不乱码吗?

        会乱码。 文件编码和读取的编码必须一致才不会乱码。

如果如何解决呢?

使用字符输入转换流

可以提取文件(GBK)的原始字节流,原始字节不会存在问题。

然后把字节流以指定编码转换成字符输入流,这样字符输入流中的字符就不乱码

字符输入转换流  

字符输入转换流:InputStreamReader,可以把原始的字节流按照指定编码转换成字符输入流。

构造器

说明

public InputStreamReader(InputStream is)

可以把原始的字节流按照代码默认编码转换成字符输入流。几乎不用,与默认的FileReader一样。

public InputStreamReader(InputStream is ,String charset)

可以把原始的字节流按照指定编码转换成字符输入流,这样字符流中的字符就不乱码了(重点)

如果需要控制写出去的字符使用的编码,怎么办?

可以把字符以指定编码获取字节后再使用字节输出流写出去:

        “我爱你中国”.getBytes(编码)

也可以使用字符输出转换流实现。

字符输出转换流  

字符输出转换流:OutputStreamWriter,可以把字节输出流按照指定编码转换成字符输出流。 

构造器

说明

public OutputStreamWriter(OutputStream os)

可以把原始的字节输出流按照代码默认编码转换成字符输出流。几乎不用。

public OutputStreamWriter(OutputStream os,String charset)

可以把原始的字节输出流按照指定编码转换成字符输出流(重点)

 

 对象序列化

作用:以内存为基准,把内存中的对象存储到磁盘文件中去,称为对象序列化。

使用到的流是对象字节输出流:ObjectOutputStream

对象反序列化

使用到的流是对象字节输入流:ObjectInputStream

作用:以内存为基准,把存储到磁盘文件中去的对象数据恢复成内存中的对象,称为对象反序列化。 

 

 

打印流 

 

PrintStream和PrintWriter的区别

打印数据功能上是一模一样的,都是使用方便,性能高效(核心优势)

PrintStream继承自字节输出流OutputStream,支持写字节数据的方法。

PrintWriter继承自字符输出流Writer,支持写字符数据出去。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

鲸海鹿林

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

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

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

打赏作者

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

抵扣说明:

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

余额充值