Java IO基础知识总结
1、IO流简介
IO即 Input/Output ,输入和输出。数据输入到计算机内存的过程即输入,反之输出到外部存储(比如数据库、文件、远程主机)的过程即输出。数据传输过程类似于水流,因此称为IO流。IO流在java中分为输入流和输出流,而根据数据的处理方式又分为字节流和字符流。
- InputStream/Reader :所有的输入流的基类,前者是字节输入流,后者是字符输入流
- OutputStream/Writer:所有输出流的基类,前者是字节输出流,后者是字符输出流
2、字节流
InputStream(字节输入流)
InputStream用于从源头(通常是文件)读取数据(字节信息)到内存中,java.io.InputStream 抽象类是所有字节输入流的父类
FileInputStream是一个比较常用的字节输入流对象,可直接指定文件路径,可以直接读取单字节数据,也可以读取至字节数组中。
另外,用于序列化和反序列化的类必须实现Serializable接口,对象中如果有属性不想被序列化,使用transient修饰
OutputStream(字节输出流)
OutputStream用于将数据(字节信息)写入到目的地(通常是文件),java.io.OutputStream抽象类是所有字节输出流的父类。
3、字符流
不管是文件读写还是网络发送接收,信息的最小存储单元都是字节,为什么IO流操作要分为字节流和字符流?
- 字符流是由java虚拟机将字节转换得到的,这个过程算是比较耗时的
- 如果我们不知道编码类型就很容易出现乱码问题
- 因此,IO流就干脆提供一个直接操作字符的接口,方便我们平时对字符进行流操作,如果音频文件、图片等媒体文件用字节流比较好,如果涉及到字符的话使用字符流比较好。
Reader(字符输入流)
Reader用于从源头(通常是文件)读取数据(字符信息)到内存中,
Reader用于读取文本,InputStream用于读取原始字节
Writer(字符输出流)
Writer用于将数据(字符信息)写入到目的地(通常是文件)
4、字节缓冲流
IO操作是很消耗性能的,缓冲流将数据加载至缓冲区,一次性读取/写入多个字节,从而避免频繁的IO操作,提高流的传输效率。字节缓冲流这里采用了装饰器模式来增强InputStream和OutputStream子类对象的功能。
字节流和字节缓冲流的性能差别在于,由于字节缓冲流内部有缓冲区(字节数组),因此,字节缓冲流会先将读取到的字节存放在缓存区,大幅减少IO次数,提高读取效率
BufferedInputStream(字节缓冲输入流)
从源头读取数据到内存的过程中不会一个字节一个字节的读取,而是会先将读取到的字节存放在缓存区,并从内部缓冲区中单独读取字节,这样大幅减少了IO次数,提高了读取效率。缓冲区的大小默认为8192 字节,可以通过构造方法来指定缓冲区的大小
BufferedOutputStream(字节输出流)
将数据写入到目的地的过程中不会一个字节一个字节的写入,而是会先将先要写入到的字节存放在缓存区,并从内部缓冲区中单独写入字节,这样大幅减少了IO次数,提高了读取效率