- 博客(22)
- 资源 (4)
- 收藏
- 关注
翻译 第二章 缓冲区(13)
<br /><br />2.4.2 直接buffer对象<br /><br />ByteBuffer对象跟其他类型的buffer最大的不同是,Bytebuffer可以作为Channel通道类处理IO的输入或输出。如果你直接跳到第三章,你会发现Channel类只接受ByteBuffer类参数。<br /><br />在第一章中我们提到,操作系统的IO操作是在内存中进行的。这些内存区域目前我们可以认为是连续的字节。因此不难发现为什么ByteBuffer是最适合处理IO操作的原因。你应该还记得,我们的操作系统会直
2010-11-22 22:48:00 502
翻译 第二章 缓冲区(12)
<br /><br />2.4.1字节顺序<br /><br />非字节类型的基本类型,除了boolean都是由多个字节组成的。这些基本类型和它们的大小总结在下面的表2.1中。<br /><br />Boolean类型表示两个值:true和false。一个byte能表示256个唯一的数值,因而boolean类型不能准确的对应到一个或多个字节上。所有的buffer都是由byte构建起来的。NIO的构架决定了实现boolean类型的buffer会存在问题,总之boolean类型的buffer是值得商榷的。<br
2010-11-15 23:00:00 566
翻译 第二章 缓冲区(11)
<br /><br />2.4 ByteBuffer<br /><br />在这一小节中,我们将更详细的讨论ByteBuffer。除了boolean其他所有的基本数据类型都相应的Buffer类型,但是ByteBuffer类型具有很多其他Buffer类型不具备的特性。字节是操作系统及其IO设备使用的基本数据类型。当在操作系统和虚拟机JVM中传递数据时,经常需要将其他的数据类型转换为组成他们的基本字节数据。就像我们下面将要看到的,面向字节级别的系统IO经常在设计Buffer和他们打交道的服务中被深入的考虑。<b
2010-11-09 21:02:00 760
翻译 第二章 缓冲区(10)
<br /><br />2.3 复制Buffer对象<br /><br />如前面讨论的那样,我们能够创建管理外部数组数据的Buffer对象。但是Buffer对象不仅能管理外部数组,也能管理其他的buffer对象。当创建一个管理其他buffer对象的buffer对象时,这个buffer对象称为视图Buffer对象。大多数的视图buffer对象都是ByteBuffer对象的视图(参看2.4.3小节)。在陷入Bytebuffer的视图Buffer的细节之前,我们先将目标放在所有buffer类型的共同点上。<br
2010-11-07 15:47:00 526
翻译 第二章 缓冲区(9)
2.2 创建buffer对象 就像我们在图2.1中看到的那样,NIO中存在7种buffer的基本类型,对应于java中除了boolean的所有java基本数据类型(第八种buffer类型是MappedByteBuffer,它是ByteBuffer处理内存映射文件的特殊形式,我们将在第三章中讨论内存映射文件)。这些类型都是不能直接实例化的。它们都是抽象类,但是他们都有静态的工厂类来创建各种类型的对象。 对于下面的讨论,我们将使用CharBuffer作为例子,当然它也适用于其他的六种buf
2010-11-06 23:14:00 814
翻译 第二章 缓冲区(8)
<br /><br />2.1.10 大块数据的移动<br /><br />设计buffer的目的就是为了高效的移动数据。像例子2.1所示的那样一个元素一个元素的移动数据,是不会高效的。如下面列出的,buffer API提供了很多的方法来移动大块的数据。<br /><br />public abstract class CharBuffer extends Buffer<br />implements CharSequence,Comparable{<br />public CharBuffer get(c
2010-11-02 21:24:00 462
翻译 第二章 缓冲区(7)
<br /><br />2.1.9 比较<br /><br />有时候比较两个buffer中的数据是非常必要的。所有的buffer都提供了一个测试两个buffer相等性的equal方法,和比较两个buffer的compareTo方法。<br /><br />public class ByteBuffer extends Buffer implements Comparable{<br />public boolean equals(Object obj);<br />public int compareTo
2010-10-26 22:02:00 482
翻译 第二章 缓冲区(6)
<br /><br />2.1.8 标记<br /><br />这一小节的开头,我们已经介绍了buffer四个属性中的三个。第四个属性标记(mark),运行buffer记住一个位置,之后再返回它。在调用mark方法之前mark是无定义的,调用之后mark被设置为当前position值。Reset方法将position设置为mark值。如果mark值是未定义的,那么reset将导致抛出InvalidMarkException异常。有一些buffer中的方法可以导致mark值变为未定义的,比如rewind、cl
2010-10-24 11:11:00 503
翻译 第二章 缓冲区(5)
<br /><br />2.1.7 压缩<br /><br />public abstract class ByteBuffer<br />extends Buffer implements Comparable{<br />public abstract ByteBuffer compact();<br />}<br /><br />有时你只想从buffer中取出一部分数据,之后又重新填充数据。为了这样做,buffer中未取出的数据必须被向前挪动,这样第一个数据的索引就变成0。如果重复的这样做效率将会非常
2010-10-20 22:37:00 535
翻译 第二章 缓冲区(4)
<br /><br />2.1.6移出数据<br /> <br />如果我们将图2.5中的buffer对象传入到通道channel中,它将从position到limit的数据传送到通道中去。这显得华而不实是吗?不!<br /> <br />同样的,当你接收到一个buffer对象,在你提取数据之前你可能需要先调用flip操作。例如,当channel完成read操作之后,如果你想查看放入由channel放入Buffer中的数据,那你需要在get之前调用flip操作。Channel对象调用put方法向缓冲区填充数
2010-10-19 18:02:00 476
翻译 第三章 缓冲区(3)
2.1.5 翻转 我们已经学会了填充buffer,现在我们准备学习从buffer中移出数据。我们想把这个buffer传递给通道channel,把内容被写到目的地去。但是如果channel调用get()方法,那么它将得到一个没有定义的数据,而不是我们刚才插入的数据。如果我们将position值设为0,那么channel就可以从正确的位置读取数据了,但是它是怎样知道我们插入数据的结尾呢?这就是limit属性被引入的目的。Limit属性确定了buffer中数据的结尾。我们需要将limit先设置为当前的
2010-10-17 22:47:00 473
翻译 第二章 缓冲区(2)
<br /><br />2.1.2 Buffer API<br /><br />现在让我们看看怎么使用一个Buffer。下面列举的是Buffer类的方法。<br /><br />package java.nio;<br /><br />public abstract class Buffer {<br />public final int capacity();<br />public final int position();<br />public final Buffer position(int p
2010-10-16 19:04:00 479
翻译 第二章 缓冲区(1)
<br /><br />第二章 缓冲区<br /> <br />所有的事物都是有联系的。<br />——伟大的爱因斯坦<br />我们的“观光旅行”将从java.nio包中的Buffer类开始。在java.nio包刚建立时,这些类就成为了包的基础部分。这一章我们将会对这些类进行详细的探讨,找出不同种类的Buffer,并学会怎样去使用它们。然后我们将分析java.nio包中的Buffer类与java.nio.channels中的Channel类的联系。<br /> <br />缓冲区(Buffer)是一个固定
2010-10-16 09:12:00 791
翻译 Java NIO 第一章 介绍(8)
<br /><br />1.4.5流IO<br /> <br />不是所有的IO都是面向块的。也有根据管线模型建立的流IO。IO流中的字节必须被顺序访问。TTY(终端)设备、打印机串口、网络连接都是典型的IO流。<br /> <br />流设备通常要比块设备慢,通常被用做间断性的输入。大多数的操作系统允许将流设备设置为非阻塞模式,这样进程就可以不停的去检测流是否有数据,而不会因为等待数据而阻塞。这样做的好处是可以让进程在没有数据的时候进行其他处理。<br /> <br />为了充分利用非阻塞流的性能可以使用
2010-10-14 20:13:00 412
翻译 Java NIO 第一章 介绍(7)
<br /><br />1.4.4.1 内存映射文件<br /> <br />对于常规的文件IO,当用户进程使用read()或者write()系统调用来传输数据时,至少会使用一次复制操作将数据从内核中的文件页传送到用户空间的内存区域。这是因为通常在文件页和用户缓冲区中没有一一对应关系。但是,现在大多数的操作系统支持一种特殊的文件操作方式,这种方式使用户进程充分利用系统IO天然的页机制,而且完全避免了缓冲区拷贝。这种方式就是内存映射文件,如图1.6所示。<br />图1.6 用户内存映射到文件系统<br />
2010-10-14 12:49:00 527
翻译 Java NIO 第一章 介绍(6)
<br /><br />1.4.4 文件IO<br /> <br /> 文件IO发生在文件系统的范畴内。文件系统跟磁盘有很大的不同。磁盘将数据保存在大小一般为512字节的扇区中。但是磁盘并不知道文件的语意。它只是简单的提供存储数据的空间。从这方面讲,磁盘的扇区跟内存的页类似;他们都是统一大小的,并且可以作为大的数组被寻址。<br /> <br /> 文件系统是更高层次的抽象。文件系统是一种在磁盘或者其他可随机和面向块设备上安排和解释数据的方法。你的代码会经常跟文件系统打交道,而不是直
2010-10-13 20:10:00 412
翻译 Java NIO 第一章 介绍(5)
<br /><br />1.4.2 虚拟内存<br /> <br /> 所有的现代操作系统都使用虚拟内存。虚拟内存意味着系统将使用人为假设(虚拟)的内存而不是物理内存。虚拟内存能提供两大基本好处:<br /> 1.多个虚拟地址可以对应一个物理内存位置。<br /> 2.虚拟内存空间可以大于实际的物理内存空间。<br /> <br /> 前面的小节中提到硬盘控制器不能将数据直接利用DMA传送到用户空间,虚拟内存的第一个好处将显现出来。通过将内核空间和用户空间的虚
2010-10-12 19:59:00 518 1
翻译 Java NIO 第一章 介绍(4)
<br />1.4 IO的一些概念<br /> <br />Java平台为IO提供了丰富的概念。而且其中一部分概念要比另外一部分更加抽象。有了这些概念,如果你接触晦涩的概念越多,你将更加顽强的面对它们之间复杂的因果关系。JDK1.4中的NIO包为IO提供了一系列的概念。不像以前的包,这个包很注重缩短概念和实现之间的距离。而且NIO概念总是直接和现实实体打交道。领悟这些直接和IO服务打交道概念将是编写对IO敏感的应用程序非常关键。<br /> <br />这本书假定你对Java基本的IO概念非常熟悉。这一小节
2010-10-11 19:09:00 494
翻译 Java NIO 第一章 介绍(3)
<br /><br />1.3 利用操作系统优秀的特质<br /> <br /> 人们对操作系统的大部分的开发工作都是为了提高系统的IO性能。很多聪明的人花费了大量的时间,使用非常高超的技术来让数据更加流畅的运行在系统中。操作系统的生产商们花费了大量的时间和金钱来寻找在某些方面击败对手的优势。<br /> <br />今天的操作系统是软件工程的一个现代奇迹(呵呵,当然有些比其他的更加了不起)。但是Java程序员们怎么来利用这些魔术,同时却能保持平台的独立性呢?呵呵,这将是另一个“天下
2010-10-08 08:57:00 462
翻译 Java NIO 第一章 介绍(2)
<br /><br />1.2 没有CPU限制<br /> <br /> 从某些程度上说,可以原谅Java程序员将主要精力放在CPU效率上的优化而没有对IO效率做过多的考虑。在Java早期,Java虚拟机解释字节码是很少甚至不对字节码做运行时优化的。这就意味着那时候Java程序比本地编译过的代码运行的慢得多,也很少需要调用操作系统的IO子系统。<br /> <br /> 但是运行时优化已经有了极大的进步。现在的虚拟机对字节码的执行速度可以与本地编译的代码相提并论,有时候因为动态运行时
2010-09-30 14:34:00 534
翻译 Java NIO 第一章 介绍(1)
绝大多数程序员把自己想象成软件艺术家,在这里弄一些聪明的代码来减少一些字节的消耗,在那里展开一个循环,在另外一些地方重构一下增强对象功能。尽管这些东西非常的重要,但是有趣的是这些优化很容易被低效的IO掩盖的一文不值。操作IO数据花费的时间跟操作内存数据相比完全不在一个数量级上。很多的码工们往往只注意到操作数据的对象,而忽略了那些包含获取、排序数据的环境因素。
2010-09-30 12:43:00 581 1
TCP-IP详解卷一:协议
2010-05-19
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人