• Java进阶——IO流



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

    字符流

    请添加图片描述

    字节流读取中文输出会存在什么问题?
    会乱码。或者内存溢出。
    读取中文输出,哪个流更合适,为什么?
    字符流更合适,最小单位是按照单个字符读取的。
    文件字符输入流:Reader
    作用:以内存为基准,把磁盘文件中的数据以字符的形式读取到内存中去。
    字符流的好处。每次读取一个字符存在什么问题?
    读取中文字符不会出现乱码(如果代码文件编码一致)
    性能较慢
    文件字符输入流:FileReader
    作用:以内存为基准,把磁盘文件中的数据以字符的形式读取到内存中去。

    每次读取一个字符数组的优势?
    读取的性能得到了提升
    读取中文字符输出不会乱码。

    字符输出流

    请添加图片描述
    字符输出流如何实现写出去的数据能换行
    fw.write(“\r\n”)
    字符输出流如何实现写出去的数据能换行
    flush()刷新数据
    close()方法是关闭流,关闭包含刷新,关闭后流不可以继续使用了。

    缓冲流

    请添加图片描述

    缓冲流概述

    缓冲流也称为高效流、或者高级流。之前学习的字节流可以称为原始流。
    作用:缓冲流自带缓冲区、可以提高原始字节流、字符流读写数据的性能
    字节缓冲流
    字节缓冲输入流:BufferedInputStream,提高字节输入流读取数据的性能。
    字节缓冲输出流:BufferedOutputStream,提高字节输出流读取数据的性能。
    缓冲流的作用?
    缓冲流自带缓冲区、可以提高原始字节流、字符流读写数据的性能
    缓冲流有几种?
    字节缓冲流
    字节缓冲输入流: BufferedInputStream
    字节缓冲输出流:BufferedOutputStream
    字符缓冲流
    字符缓冲输入流:BufferedReader
    字符缓冲输出流:BufferedWriter
    字节缓冲流为什么提高了操作数据的性能?
    字节缓冲流自带8KB缓冲区
    可以提高原始字节流、字符流读写数据的性能
    字节缓冲流的功能如何调用?
    public BufferedOutputStream​(OutputStream os)
    public BufferedInputStream​(InputStream is)
    功能上并无很大变化,性能提升了。

    字节缓冲流的性能分析

    分别使用不同的方式复制大视频观察性能情况
    需求
    分别使用低级字节流和高级字节缓冲流拷贝大视频,记录耗时。
    分析
    使用低级的字节流按照一个一个字节的形式复制文件。
    使用低级的字节流按照一个一个字节数组的形式复制文件。
    使用高级的缓冲字节流按照一个一个字节的形式复制文件。
    使用高级的缓冲字节流按照一个一个字节数组的形式复制文件。
    推荐使用哪种方式提高字节流读写数据的性能?
    建议使用字节缓冲输入流、字节缓冲输出流,结合字节数组的方式,目前来看是性能最优的组合。

    字符缓冲流

    请添加图片描述
    字符缓冲输入流
    字符缓冲输入流:BufferedReader。
    作用:提高字符输入流读取数据的性能,除此之外多了按照行读取数据的功能。
    字符缓冲输出流
    字符缓冲输出流:BufferedWriter。
    作用:提高字符输出流写取数据的性能,除此之外多了换行功能

    总结

    字符缓冲流为什么提高了操作数据的性能?
    字符缓冲流自带8K缓冲区
    可以提高原始字符流读写数据的性能
    字符缓冲流的功能如何使用?
    public BufferedReader​(Reader r)
    性能提升了,多了readLine()按照行读取的功能

    public BufferedWriter​(Writer w)
    性能提升了,多了newLine()换行的功能

    转换流

    乱码问题

    1、之前我们使用字符流读取中文是否有乱码?
    没有的,因为代码编码和文件编码都是UTF-8。
    2、如果代码编码和文件编码不一致,使用字符流直接读取还能不乱码吗?
    会乱码。
    文件编码和读取的编码必须一致才不会乱码。

    使用相同编码读取不同编码的文件内容
    需求:分别使用如下两种方式读取文件内容
    代码编码是UTF-8,文件编码也是UTF-8,使用字符流读取观察输出的中文字符结果。
    代码编码是UTF-8,文件编码使用GBK,使用字符流读取观察输出的中文字符结果

    总结

    字符流直接读取文本内容。
    必须文件和代码编码一致才不会乱码
    如果文件和代码编码不一致,读取将出现乱码。

    字符输入流转换

    1、如果代码编码和文件编码不一致,使用字符流直接读取还能不乱码吗?
    会乱码。
    2、如果如何解决呢?
    使用字符输入转换流
    可以提取文件(GBK)的原始字节流,原始字节不会存在问题。
    然后把字节流以指定编码转换成字符输入流,这样字符输入流中的字符就不乱码了请添加图片描述字符输入转换流
    字符输入转换流:InputStreamReader,可以把原始的字节流按照指定编码转换成字符输入流。

    总结

    字符输入转换流InputStreamReader作用:
    可以解决字符流读取不同编码乱码的问题
    public InputStreamReader(InputStream is,String charset):
    可以指定编码把原始字节流转换成字符流,如此字符流中的字符不乱码。

    字符输出转换流

    1、如果需要控制写出去的字符使用的编码,怎么办?
    可以把字符以指定编码获取字节后再使用字节输出流写出去:
    “我爱你中国”.getBytes(编码)
    也可以使用字符输出转换流实现。
    请添加图片描述
    字符输出转换流
    字符输入转换流:OutputStreamWriter,可以把字节输出流按照指定编码转换成字符输出流。

    总结

    字符输出转换流OutputStreamWriter的作用?
    public OutputStreamWriter(OutputStream os,String charset)
    可以指定编码把字节输出流转换成字符输出流,从而可以指定写出去的字符编码!

    序列化对象

    对象序列化

    对象序列化:
    作用:以内存为基准,把内存中的对象存储到磁盘文件中去,称为对象序列化。
    使用到的流是对象字节输出流:ObjectOutputStream
    请添加图片描述
    对象序列化:
    使用到的流是对象字节输出流:ObjectOutputStream

    总结

    对象序列化的含义是什么?
    把对象数据存入到文件中去。
    对象序列化用到了哪个流?
    对象字节输出流ObjectOutputStram
    public void writeObject(Object obj)
    序列化对象的要求是怎么样的?
    对象必须实现序列化接口

    对象反序列化

    请添加图片描述
    对象反序列化:
    使用到的流是对象字节输入流:ObjectInputStream
    作用:以内存为基准,把存储到磁盘文件中去的对象数据恢复成内存中的对象,称为对象反序列化。

    总结

    对象反序列化的含义是什么?
    把磁盘中的对象数据恢复到内存的Java对象中。
    对象反序列化用到了哪个流?
    对象字节输入流ObjectInputStram
    public Object readObject()

    打印流

    PrintStream、PrintWriter

    请添加图片描述
    打印流
    作用:打印流可以实现方便、高效的打印数据到文件中去。打印流一般是指:PrintStream,PrintWriter两个类。
    可以实现打印什么数据就是什么数据,例如打印整数97写出去就是97,打印boolean的true,写出去就是true。
    PrintStream和PrintWriter的区别
    打印数据功能上是一模一样的,都是使用方便,性能高效(核心优势)
    PrintStream继承自字节输出流OutputStream,支持写字节数据的方法。
    PrintWriter继承自字符输出流Writer,支持写字符数据出去。

    总结

    打印流有几种?各有什么特点?
    打印流一般是指:PrintStream,PrintWriter两个类。
    打印功能2者是一样的使用方式
    PrintStream继承自字节输出流OutputStream,支持写字节
    PrintWrite继承自字符输出流Writer,支持写字符
    打印流的优势是什么?
    两者在打印功能上都是使用方便,性能高效(核心优势)

    输出语句的重定向

    输出语句重定向
    属于打印流的一种应用,可以把输出语句的打印位置改到文件。

    PrintStream ps = new PrintStream("文件地址")System.setOut(ps);
    
    • 1

    补充:Properties

    请添加图片描述

    Properties属性集对象
    其实就是一个Map集合,但是我们一般不会当集合使用,因为HashMap更好用。
    Properties核心作用:
    Properties代表的是一个属性文件,可以把自己对象中的键值对信息存入到一个属性文件中去。
    属性文件:后缀是.properties结尾的文件,里面的内容都是 key=value,后续做系统配置信息的。

    总结

    Properties的作用?
    可以存储Properties属性集的键值对数据到属性文件中去:
    void store​(Writer writer, String comments)
    可以加载属性文件中的数据到Properties对象中来:
    void load​(Reader reader)

    补充:IO框架

    commons-io概述
    commons-io是apache开源基金组织提供的一组有关IO操作的类库,可以提高IO功能开发的效率。
    commons-io工具包提供了很多有关io操作的类。有两个主要的类FileUtils, IOUtils
    步骤
    导入commons-io-2.6.jar做开发
    需求
    使用commons-io简化io流读写
    分析
    在项目中创建一个文件夹:lib
    将commons-io-2.6.jar文件复制到lib文件夹
    在jar文件上点右键,选择 Add as Library -> 点击OK
    在类中导包使用

  • 相关阅读:
    OpenCV学习(六)——图像算术运算(加法、融合与按位运算)
    pandas教程:Handling Missing Data 处理缺失数据
    leetcode-887-鸡蛋掉落(包含最大值最小化,最小值最大化的二分优化+滚动数组的原理)
    网络分析笔记07:pcapng增强分组块的捕获长度偏差
    Element 自定义指令 下拉分页,获取无限数据
    Spring Boot拦截器(Interceptor)详解
    打不开clickonce问题解决过程
    uniapp editor组件添加插入超链接
    Spring Boot 如何使用Liquibase 进行数据库迁移
    AI小程序——文本绘图
  • 原文地址:https://blog.csdn.net/weixin_49405762/article/details/126392266