IO流
概念
I – in – 输入(读)
O – out – 输出(写)
流 – 一点一点的像水流一样去传输数据
注意:站在程序的角度去看待输入还是输出
分类
按照方向分流:输入流、输出流
按照单位分流:字节流、字符流
按照功能分流:基础流/节点流、处理流
注意:new 处理流(new 基础流) – 装饰者模型 – 处理流对象中往往包含了基础流的对象,在基础流的基础上拓展了额外的功能,使得流更为强大(效率),工作中一般使用处理流
存储单位
1024byte = 1KB
1024KB = 1MB
1024MB = 1GB
1024GB = 1TB
1024TB = 1PB
注意:进制1024
学习注意事项
- 按照流的发展历史去学习
- 注意流与流之间的继承关系
- 举一反三
字节流
应用场景:操作二进制数据(音频、视频、图片)
abstract class InputStream – 字节输入流的基类(抽象类)
abstract class OutputStream – 字节输出流的基类(抽象类)
class FileInputStream extends InputStream – 文件字节输入流
class FileOutputStream extends OutputStream – 文件字节输出流
class FilterInputStream extends InputStream – 过滤器字节输入流
class FilterOutputStream extends OutputStream – 过滤器字节输出流
class BufferedInputStream extends FilterInputStream – 带缓冲区的字节输入流
class BufferedOutputStream extends FilterOutputStream – 带缓冲区的字节输出流
默认缓冲区大小:8192字节 - new byte[8192]
字符流
应用场景:操作纯文本数据
注意:字符流 = 字节流+编译器
编译器:可以识别中文字符和非中文字符,非中文字符获取1个字节(一个字节=一个字符),编译器会根据编码格式获取中文字符对应的字节数(GBK获取两个字节,UTF-8获取三个字节)
abstract class Reader – 字符输入流的基类(抽象类)
abstract class Writer – 字符输出流的基类(抽象类)
class InputStreamReader extends Reader – 字符输入转换流
class OutputStreamWriter extends Writer – 字符输出转换流
特点:将字节流转换为字符流,字符转换流是字节流和字符流的桥梁
class FileReader extends InputStreamReader – 文件字符输入流
class FileWriter extends OutputStreamWriter – 文件字符输出流
class BufferedReader extends Reader – 带缓冲区的字符输入流
class BufferedWriter extends Writer – 带缓冲区的字符输出流
默认缓冲区:8192字符 – new char[8192]
各种流
对象流
class ObjectInputStream – 对象输入流
class ObjectOutputStream – 对象输出流
理解:
将程序中的对象写入到文件
并且从文件中读取出对象到程序里
序列化(钝化):将程序里的对象写入到文件
反序列化(活化):将文件里的对象读取到程序中
注意:
- 如果对象想写入文件,对象所属的类就必须实现序列化接口(Serializable)
- Serializable序列化接口没有任何的属性和方法,这种接口称之为标记型接口
- 对象所属的类实现了序列化接口一定要添加序列化ID(serialVersionUID)
- 属性使用transient修饰,该属性不会随着对象而写入到文件中
内存流
class ByteArrayInputStream – 内存输入流
class ByteArrayOutputStream – 内存输出流
注意:
- 内存流是程序和内存交互,跟文件无关
- 内存流是程序到内存的通道,是关闭不掉的
应用场景:项目中频繁使用的数据可以使用内存流备份一份
打印流
class PrintStream – 字节打印流
class PrintWriter – 字符打印流
注意:打印流实际上就是输出流,只有一个方向(程序->文件)
PrintStream vs PrintWriter
区别1:PrintStream是以字节为单位,PrintWriter是以字符为单位
区别2:
PrintStream:将字节流转换为字节打印流
PrintWriter:将字节流和字符流转换为字符打印流
重定向
理解:重新定义系统标准的输入流、输出流、错误输出流的方向
System.in:获取系统标准输入流的方向(控制台->程序)
System.out:获取系统标准输出流的方向(程序->控制台)
System.err:获取系统标准错误输出流的方向(程序->控制台)//重定向:重新定义系统标准输入流的方向(文件->程序)
System.setIn(new FileInputStream(“io.txt”));//重定向:重新定义系统标准输出流的方向(程序->文件)
System.setOut(new PrintStream(new FileOutputStream(“io.txt”,true)));//重定向:重新定义系统标准错误输出流的方向(程序->文件)
System.setErr(new PrintStream(new FileOutputStream(“io.txt”,true)));
随机访问流
class RandomAccessFile
理解:该流认为文件是一个大型的byte数组。有一个隐藏的指针(默认为0),其实就是下标,可以从指针的位置写入或读取,意味着该流两个方向
模式:r-读,rw-读写
提升作业:
流的大类:BIO、NIO、AIO
学习NIO和AIO,制作md文档,其中包含概念、理解和代码