IO中的几种形式基于字节:InputStream、OutputStream基于字符:Writer、Reader基于磁盘:File基于网络Socket 最终都是字节操作,字符到字节要编码转换。耗时,容易乱码 1,磁盘IO磁盘设置,应用程序只能系统调用,要内核空间和用户空间切换,标准访问文件:读取为例,先读到内核空间,再读到用户空间。另外有直接IO,系统缓存一下,直接从缓存读同步,异步,内存映射(内核空间映射到用户空间减少复制操作) 2,网络IOSocket是抽象概念,也是字节流 3,NIO主要是信道和选择器。传统IO访问竞争资源要同步,产生阻塞NIO一个线程监听客户端请求,阻塞方式执行。另外一个线程负责处理请求用NIOtomcat的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字节最终调用InputStreamInputStreamReader:对象+接口 装饰器模式,接口不变,增强原来对象的功能赋予类更多的功能,FileInputStream,BufferedInputStream是具体实现者,把InputStream读取内容保存在内存中,增强了功能。 抽象组件:InputStream装饰器FileInputStream:实现了InputStream所有接口,持有InputStream引用实现者BufferedInputStream:把InputStream读取内容保存在内存中,增强了功能。