Java nio 入门教程详解(2)
时间:2026-01-19
时间:2026-01-19
Java nio 入门教程详解(2)
Java nio 入门教程详解(六)Java 2013 年 8 月 12 日 暂无评论2.3 复制缓冲区如我们刚刚所讨论的那样,可以创建描述从外部存储到数组中的数据元素的缓冲区对象。但是缓冲区不限 于管理数组中的外部数据。它们也能管理 其他缓冲区 中的外部数据。当一个管理其他缓冲器所包含的数 据元素的缓冲器被创建时,这个缓冲器被称为视图缓冲器。大多数的视图缓冲器都是 ByteBuffer(参见 2.4.3 节)的视图。在继续前往字节缓冲器的细节之前,我们先将注意力放在所有存储器类型的共同视图 上。 视图存储器总是通过调用已存在的存储器实例中的函数来创建。使用已存在的存储器实例中的工厂方法意 味着视图对象为原始存储器的内部实现细节私有。数据元素可以直接存取,无论它们是存储在数组中还是 以一些其他的方式,而不需经过原始缓冲区对象的 get()/put()API。如果原始缓冲区是直接缓冲区,该 缓冲区的视图会具有同样的效率优势。映像缓冲区也是如此(将于第三章讨论)。 在这一章节中,我们将再次以 CharBuffer 为例,但同样的操作可被用于任何基本的缓 冲区类型(参见图 2.1)。1. 2. 3. 4. 5. 6. 7. public abstract class CharBuffer extends Buffer implements CharSequence, Comparable { // 这里仅列出部分 API public abstract CharBuffer duplicate(); public abstract CharBuffer asReadOnlyBuffer(); public abstract CharBuffer slice(); }duplicate()函数创建了一个与原始缓冲区相似的新缓冲区。 两个缓冲区共享数据元素, 拥有同样的容量, 但每个缓冲区拥有各自的位置,上界和标记属性。对一个缓冲区内的数据元素所做的改变会反映在另外一 个缓冲区上。这一副本缓冲区具有与原始缓冲区同样的数据视图。如果原始的缓冲区为只读,或者为直接 缓冲区,新的缓冲区将继承这些属性。直接缓冲区将在 2.4.2 节中讨论。 复制一个缓冲区会创建一个新的 Buffer 对象,但并不复制数据。原始缓冲区和副本都会操作同样的数据 元素。 缓冲区及其副本之间的联系如图 2.12 所示。这是如下文所示的代码产生的:1. 2. 3. 4. CharBuffer buffer = CharBuffer.allocate (8); buffer.position (3).limit (6).mark().position (5); CharBuffer dupeBuffer = buffer.duplicate(); buffer.clear();
Java nio 入门教程详解(2)
图 2-12 复制一个缓冲区您可以使用 asReadOnlyBuffer()函数来生成一个只读的缓冲区视图。这与 duplicate()相同,除了这个 新的缓冲区不允许使用 put(),并且其 isReadOnly()函数将会返回 true。对这一只读缓冲区的 put() 函数的调用尝试会导致抛出 ReadOnlyBufferException 异常。 如果一个只读的缓冲区与一个可写的缓冲区共享数据,或者有包装好的备份数组,那么对这个可写的缓冲 区或直接对这个数组的改变将反映在所有关联的缓冲区上,包括只读缓冲区。 分割缓冲区与复制相似,但 slice()创建一个从原始缓冲区的当前位置开始的新缓冲区,并且其容量是原 始缓冲区的剩余元素数量(limit-position)。 这个新缓冲区与原始缓冲区共享一段数据元素子序列。 分 割出来的缓冲区也会继承只读和直接属性。 图 2-13 显示了以与下面代码相似的代码所生成的分割缓冲区:1. 2. CharBuffer buffer = CharBuffer.allocate (8); buffer.position (3).limit (5); CharBuffer sliceBuffer = buffer.slice();3.图 2-13 创建分割缓冲区要创建一个映射到数组位置 12-20(9 个元素)的 buffer 对象,应使用下面的代码实现:1. 2. 3. 4. char [] myBuffer = new char [100]; CharBuffer cb = CharBuffer.wrap (myBuffer); cb.position(12).limit(21); CharBuffer sliced = cb.slice();更详细关于视图 buffer 的讨论参见 2.4.3 节。
Java nio 入门教程详解(2)
Java nio 入门教程详解(七)Java 2013 年 8 月 14 日 暂无评论2.4 字节缓冲区在本章节中,我们将进一步观察字节缓冲区。所有的基本数据类型都有相应的缓冲区类(布尔型除外), 但字节缓冲区有自己的独特之处。 字节是操作系统及其 I/O 设备使用的基本数据类型。 当在 JVM 和操作 系统间传递数据时,将其他的数据类型拆分成构成它们的字节是十分必要的。如我们在后面的章节中将要 看到的那样,系统层次的 I/O 面向字节的性质可以在整个缓冲区的设计以及它们互相配合的服务中感受 到。 为了提供参考,以下是 ByteBuffer 的完整 API。这些函数有些已经在前面的章节中讨论,并且仅仅 是针对具体类型的版本。新的函数将在本节以及后面的章节中涉及。1. 2. 3. 4. 5. 6. 7. 8. 9.package java.nio; public abstract class ByteBuffer extends Buffer implements Comparable { public static ByteBuffer allocate (int capacity) public static ByteBuffer allocateDirect (int capacity) public abstract boolean isDirect(); public static ByteBuffer wrap (byte[] array, int offset, int length) public static ByteBuffer wrap (byte[] array) public abstract ByteBuffer duplicate();10. public abstract ByteBuffer asReadOnlyBuffer(); 11. public abstract ByteBuffer slice(); 12. public final boolean hasArray() 13. public final byte [] array() 14. public final int arrayOffset() 15. public abstract byte get(); 16. public abstract byte get (int index); 17. public ByteBuffer get (byte[] dst, int offset, int length) 18. public ByteBuffer get (byte[] dst, int offset, int length) 19. public abstract ByteBuffer put (byte b); 20. public abstract ByteBuffer put (int index, byte b); 21. public ByteBuffer put (ByteBuffer src) 22. public ByteBuffer put (byte[] src, int offset, int length) 23. public final ByteBuffer put (byte[] …… 此处隐藏:17218字,全部文档内容请下载后查看。喜欢就下载吧 ……
上一篇:中华少年诗朗诵分角色