(一)IO概念
应用程序中,常碰到的运算:CPU运算和IO运算。IO运算是应用程序的瓶颈,磁盘和网络IO操作都较慢。
(二)分类
是否阻塞:普通IO和NIO
数据单位划分:字节流和字符流
数据流方向:输入流和输出流
功能划分:节点流和处理流(处理流利用装饰者模式套接节点流,直接转换字节读取字符,如BufferedOutputStream)
(三)字节流和字符流
字节流是1byte=8bit,字符流是2byte
jdk提供的四个io抽象类:字节流(InputStream和OutputSteam),字符流(Writer和Reader),更多信息参考这篇博文
磁盘和网络传输都是以字节为单位,字符只存在于JVM内存中;直接以字节传输会比较快
(四)输入流和输出流
输入流指从磁盘网络输入数据到程序,输出流指从程序输出数据到磁盘网络
(五)字符和编码
数据持久化和网络数据传输,都是以字节流进行的,所以经常需要进行字符字节相互转换。转换过程中涉及到字符编码解码问题,容易出现乱码。关于编码问题可以参考《深入分析Java中的中文编码问题》。
(六)序列化和反序列化
对象需要序列化转换成二进制流才能进行持久化或传输,需要实现Serializable接口,读取时再反序列化。序列化反序列化可以参考《Java 7之基础 - 序列化与反序列化》。
(七)网络IO性能优化
(1)减少访问网络次数:设置缓存或合并请求
(2)减少网络传输数据量大小:数据压缩
(3)减少编码,直接用字节流传输
(4)合理选用普通IO还是NIO方式