【翻译】《Java™ I/O, 2nd Edition》-14.0 前言

这是本人学习NIO时候翻译Elliotte Rusty Harold的《Java™ I/O, 2nd Edition》,这本书已经由O'Reilly在2006年出版,网上也可以下载得到,这本书完整描述了Java的IO体系(除了后来才新增的Java7的AIO),本人只翻译了与NIO有关的第14、15、16章。网上关于NIO的书还有一本就是Ron Hitchens的《Java™ NIO》,由O'Reilly在2004年出版,这本书也是相当不错,最重要的还有高清的pdf中文版,我是看了《Java™ NIO》之后才开始翻译《Java™ I/O, 2nd Edition》的。本人英语比较烂,希望没有翻错误导大家。
 
 14.0 前言
 
传统的同步IO是为传统的程序而设计的,这些程序有以下特点:
1,文件可能比较大但不是非常巨大,机器能够将整个文件加载到内存。
2,程序在同一时间只对少量的文件、网络连接进行读写。
3,程序是按顺序运行的,在完成读写之前不会做别的事情。
 
只要这些特点存在,可以理解基于流的IO是迅速且有效的。但是如果这些前提条件没有被满足,那么标准的IO模型就会显出弱点。例如web服务器经常要同时处理成百上千的连接,科学、工程学、多媒体应用程序经常要操纵大小数以G计的的数据集
 
Java1.4引入了一个新的IO模型(译注:以下简称NIO),这个模型不是为传统的、不需要大量IO的应用程序设计的,更多是为上述特殊需求的程序而设计。组成NIO库的类都在java.nio以及它的子包下面。NIO模型不是用来取代传统的流式IO。事实上NIO API中的好几个部分都是基于流式IO的。但是,NIO模型对于几种IO密集型的应用程序是非常有效的。
 
传统的IO模型是基于流的,而NIO是基于通道(channel)和缓冲区(buffer)的,缓冲区就像数组(在某些实现中它实际上就是一个数组),它持有将要读写的数据。然而与输入、输出流不同,缓冲区可以用来读和写。输入通道(input channel)用数据填充缓冲区,输出通道(output channel)则读取缓冲区中的数据。缓冲区不是通道的一部分,但它天生就是通道交换数据的地方。并且因为缓冲区是对象,对它的访问是通过方法调用进行的,因此缓冲区可能不是真正的数组。为了速度和随机访问,缓冲区可以直接基于内存、磁盘来实现,对于某些适当的程序,性能的提升是巨大的。
 
如数组一样,缓冲区是有类型的。例如有字节缓冲区,整型缓冲区,浮点数缓冲区和字符缓冲区。类库中没有字符串缓冲区或者对象缓冲区,但是如果有需要的话你可以自己实现这些类。一些基本的操作都适用于这些不同的缓冲区,这些基本的操作有:
 
  • 为缓冲区分配空间
  • 将数据放入缓冲区
  • 从缓冲区中读取数据
  • 切换缓冲区的工作模式(Flip the buffer.)
  • 清空缓冲区
  • 缓冲区回倒(Rewind the buffer)
  • 标记缓冲区
  • 重置缓冲区
  • 为缓冲区切片(Slice the buffer. )
  • 压缩缓冲区
  • 复制缓冲区
posted @ 2015-07-09 13:33  youth7  阅读(563)  评论(0编辑  收藏  举报