java IO流总结

今天面试面试官问到了JavaIo流相关的东西,一直对这块比较模糊,写的代码也不多,索性来总结一下

什么是IO?

IO(Input/output) 是指数据在计算机内存和硬盘/网卡之间的交互过程 分为输入流和输出流
主要分类有磁盘IO和硬盘IO

Java中有什么IO工具类?

按IO的传输格式可以分为字节IO和字符IO
即Input/OutputStream 和 Reader/Writer
Input/OutputStream 和 Reader/Writer都是抽象类 需要借助具体的实现类才能使用
这里借用一下别人的图
在这里插入图片描述

Stream

常用的输入流有FileInputStream BufferedInputStream ObjectInputStream
常用的输出流有FileOutputStream BufferedOutputStream PrintStream ObjectOutputStream
其中 Buffered是缓冲流 必须结合其他流才能使用
基础的文件流使用:
在这里插入图片描述
其实字节流不太适合写字符 要手动把String转成byte[] 并设置编码
输入流的话 一次只能读一个字节的数据(那遇到中文不完蛋了?) 果然遇到中文会乱码 所以要涉及字符还是用字符流
在这里插入图片描述
若是英文的话读到的一个字节直接转为char就能显示
在这里插入图片描述
要读中文的话可以全部读到再转String 不过还是很简陋 没法按行读
在这里插入图片描述
Object流的使用

可以输出对象 并从文件中恢复对象 即序列化与反序列化 有疑问 每个对象结构不同 那是怎么恢复呢?
先定义一个简单的Dog类
注:该类必须实现Serializable接口才可以被序列化
在这里插入图片描述
Object流也必须搭配其他输入输出流才可使用
在这里插入图片描述
可以恢复dog 对象 但是如果是比较复杂的对象呢? 比如HashMap
竟然也可以 这就比较神奇了 毕竟HashMap内部有很多属性 难道都会写进去吗
在这里插入图片描述
HashMap内部定义了WriteObject 和ReadObject 方法
用于自定义的序列化与反序列化
write就是把一些关键信息+每个键值对都写进去了
在这里插入图片描述
read比较复杂 要重新计算长度
若是往map里加的对象没有实现序列化接口 则报异常
在这里插入图片描述

Buffer缓冲流的使用
缓冲流在内存中维护一个 ​​固定大小的缓冲区(通常为 8KB)​​,所有读写操作优先在缓冲区中进行,而非直接操作磁盘或网络。

写入时​​:数据先存入缓冲区,缓冲区满后一次性写入磁盘(减少多次小数据写入的开销)。

​​读取时​​:一次性从磁盘读取多个字节到缓冲区,后续读取直接从内存获取(减少磁盘访问次数)。
因为用到了缓冲区
所有
所以要手动flush 或close才会将字节流写入(或缓冲区用完了 默认8kb)
在这里插入图片描述超过8kb则自动写入
由于用了缓存 缓冲区读取/保存字节的效率提高了数百倍!
这里用缓冲字节流复制一个306M的视频

![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/e5457f09eb08448b8在这里插入图片描述
e8f4de1338e1f5.png)
在这里插入图片描述
好像时间也并无太大差异

Reader 和 Writer

Reader
在这里插入图片描述
在这里插入图片描述
奇怪 竟然没有readline吗 那怎么读一行
在这里插入图片描述
用BufferReader 方便又高效!
在这里插入图片描述
写完记得flush!

总结

一般来用都用缓冲流 一方面是效率高 一方面是方法多
缓冲流需要传一个普通流进去 相当于包装类
ObjectStream 是用来序列化反序列化的 对象必须实现序列化接口

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐