IO中的几种形式

基于字节:InputStream、OutputStream

基于字符:Writer、Reader

基于磁盘:File

基于网络Socket

 

最终都是字节操作,字符到字节要编码转换。耗时,容易乱码

 

1,磁盘IO

磁盘设置,应用程序只能系统调用,要内核空间和用户空间切换,

标准访问文件:

读取为例,先读到内核空间,再读到用户空间。

另外有直接IO,系统缓存一下,直接从缓存读

同步,异步,内存映射(内核空间映射到用户空间减少复制操作)

 

2,网络IO

Socket是抽象概念,也是字节流

 

3,NIO

主要是信道和选择器。传统IO访问竞争资源要同步,产生阻塞

NIO一个线程监听客户端请求,阻塞方式执行。另外一个线程负责处理请求用NIO

tomcat的NIO

<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"

可以看出在处理动态资源时NIO的优势并不明显甚至还不如IO,其主要原因是动态资源,是IO和cpu密集型操作,导致很多请求都阻塞在CPU和IO上,所以socket IO只能干等着,发挥不出NIO的优势 

再看处理静态时NIO的表现,虽然不稳定但性能的提升还是很明显的,所以NIO常常用来处理请求多并且处理起来比较简单的应用中,如memcached,NIO的方式连接redis也能提升并发数

 

FileChannel

把文件映射到内存区域,省去了内核空间复制到用户空间的损耗

 

 

4,IO调优

 

磁盘:增加缓存,减少磁盘访问次数

 

TCP网络:TCP连接复用,增加端口范围

减少网络交互次数、传输数据量、减少编码(转化成字节再发送)

注意动态资源NIO,不明显,静态资源更适合

 

5,相关的设计模式:

 

适配器模式,改变接口来重复使用

把一个类的接口变成客户端能接受的另一种接口。

使两个接口不一样的类能一起工作。

InputStreamReader适配器实现了Reader接口,持有InputStream引用。这样Reader字节最终调用InputStream

InputStreamReader:对象+接口

 

装饰器模式,接口不变,增强原来对象的功能

赋予类更多的功能,

FileInputStream,

BufferedInputStream是具体实现者,把InputStream读取内容保存在内存中,增强了功能。

 

抽象组件:InputStream

装饰器FileInputStream:实现了InputStream所有接口,持有InputStream引用

实现者BufferedInputStream:把InputStream读取内容保存在内存中,增强了功能。