这里这个I指的是input,而这个O指的则是output,对于IO的认识就是输入输出。在讨论IO的时候,流则是关键中的关键
按数据流向分类
输入流和输出流
按处理的数据类型分类
字节流和字符流
字节流
对于字节流,它是用来操作我们的二进制文件的,因为字节流可以操作的数据是8位,也就是一字节,我们知道1 byte = 8bit,而像一些数字和字母等都是占一个字节,包括平常见到的图片,音视频等,这就可以使用字节流来操作,但是对于中文的话就不能使用字节流了
字符流
因为一个汉字是占两个字节,那么就是16位,字节流是操作不了的,而字符流则可以操作16位,所以对于文本文件则常用字符流操作了
输入流和输出流
按照流的流向来分,可以分为输入流和输出流。输入,输出都是从程序运行所在内存的角度来划分的。
输入流:只能从中读取数据,而不能向其写入数据,由InputStream和Reader作为基类。
输出流:只能向其写入数据,而不能从中读取数据。由OutputStream和Writer作为基类
字节流和字符流
字节流和字符流的用法几乎完全一样,区别在于字节流和字符流所操作的数据单元不同。
字节流操作的数据单元是8位字节,由InputStream和OutputStream作为基类。
字符流操作的数据单元是16为的字符,由Reader和Writer作为基类(提供了转换流)
节点流和处理流
按照流的角色来分,可以分为节点流和处理流。
节点流:可以从向一个特定的IO设备(如磁盘、网络)读/写数据的流。也被称为低级流。
处理流:用于对一个已存在的流进行连接或封装,通过封装后的流来实现数据读/写功能。也称为高级流
AIO 是彻底的异步非阻塞。NIO 是同步非阻塞通信。BIO 是同步阻塞。
假设有这么一个场景,有一排水壶(客户)在烧水。同步说的是线程同步,阻塞说的是水壶阻塞。
AIO的做法是,每个水壶上装一个开关,当水开了以后会提醒对应的线程去处理。
NIO的做法是,叫一个线程不停的循环观察每一个水壶,根据每个水壶当前的状态去处理。
BIO的做法是,叫一个线程停留在一个水壶那,直到这个水壶烧开,才去处理下一个水壶。
BIO、NIO、AIO适用场景分析:
NIO将多个IO的阻塞复用到同一个select的阻塞上,从而使得系统在单线程的情况下处理多个客户端请求。
NIO三个核心对象:通道(Channel)、缓冲区(Buffer)和选择器(Selector)
具体说就是Selector会不断轮询注册在其上的Channel,如果某个Channel上有新的TCP连接,读或者写事件,这个Channel就处于就绪状态,会被Selector轮询出来,然后通过SelectorKey可以获取就绪Channel的集合,进行后续I/O操作。
序列化的原本意图是希望对一个Java对象作一下“变换”,变成字节序列,这样一来方便持久化存储到磁盘,避免程序运行结束后对象就从内存里消失,另外变换成字节序列也更便于网络运输和传播,所以概念上很好理解:
static
修饰的字段是不会被序列化的transient
修饰符修饰的字段也是不会被序列化的原文:https://www.cnblogs.com/renxiuxing/p/15177929.html