http://www.iteye.com/magazines/132-Java-NIO
http://liyuanning.blog.163.com/blog/static/457322862010102321121/
http://kingkongzhao.blog.51cto.com/6319491/1672929/
http://www.ibm.com/developerworks/cn/java/j-lo-javaio/
http://blog.csdn.net/hansnowqiang/article/details/50130437
http://blog.csdn.net/yuebinghaoyuan/article/details/7388059
http://www.cnblogs.com/shitouer/archive/2012/12/19/2823641.html
http://blog.csdn.net/smartbetter/article/details/51323904
http://www.cnblogs.com/hqr9313/archive/2012/04/23/2467294.html
http://blog.csdn.net/hijiankang/article/details/51027565
IO总的来说分为两种,一种是流,分为字符流、字节流、位流等等,另一种是记录、数据块等等;两者的区别是,流的数据中没有同步信息、管理信息,只是单纯的数据,而记录、数据块则存在同步和管理信息。
C++的IO流属于字符流,数据在流中的内部表示是字符,不是字节或位。IO流是文本IO,不是二进制IO,但它常常因为具有文件二进制模式而被人误解为既是文本IO也是二进制IO,这是错误的,binary模式仅仅暂时性抑制了IO流中的格式化层及与操作系统相关的一些转换(例如
),并没有改变IO流的文本IO性质,即在binary模式中的流仍然是字符流(只不过没有进行自动转换),而不是字节流。
C++的IO流分为两层:格式化层和传输层。
格式化层进行输出中的格式化及输入中的解析,例如将浮点数的内部二进制表示转换为打印字符或者从缓冲中抽取字符转换为整数的二进制内部表示等等。
传输层包括缓冲区、编码转换和传递层,缓冲区不用说,就是内部字符的缓冲啦,编码转换用于字符的内部表示和外部表示之间的转换,IO流的编码转换只支持宽字符和多字节字符集之间的转换,传递层用于与外部设备之间的连接。
C++的IO流对象默认情况下是与C的stdin、stdout、stderr连接在一起的,视具体实现不同,IO流可能使用C的缓冲区而自身没有缓冲区,也可能两者共享相同的缓冲区,这是IO流比C的输入输出函数慢的一个原因,但可以将两者解开,通过函数ios_base::sync_with_stdio( false )进行,如果参数为true,则重新连接。在某些环境下,例如g++,两者连接解开后,IO流的效率是C的输入输出函数的3倍。