mark就像书签一样,在这个IoBuffer里作个标记,以后再调用reset时就可以再回到这个mark过的地方。 也就是mark与reset是配对使用的!
mark方法有个参数,通过这个整型参数,你告诉系统,希望在读出这么多个字符之前,这个mark保持有效。读过这么多字符之后,系统可以使mark不再有效,而你不能觉得奇怪或怪罪它。这跟buffer有关,如果你需要很长的距离,那么系统就必须分配很大的buffer来保持你的mark。
这个方法可以这么用吧,我想。读的时候,你读出了若干字符,做了某些判断或处理,发现还是从头来过比较好,也就是退回到原来的位置,再读一遍。用高手的话来说“mark就像书签一样,在这个BufferedReader对应的buffer里作个标记(xxx到此一游 哈哈),以后再调用reset时就可以再回到这个mark过的地方。”只是一游,神马都没变化!
//reader is a BufferedReader
reader.mark(50);//要求在50个字符之内,这个mark应该保持有效,系统会保证buffer至少可以存储50个字符
int a = reader.read();//读了一个字符
int b = reader.read();//又读了一个字符
//做了某些处理,发现需要再读一次
reader.reset();
reader.read();//读到的字符和a相同
reader.read();//读到的字符和b相同
——————————————————————————————————————————————————
后附相关JDK原文档解释:
mark
public final Buffer mark()
在此缓冲区的位置设置标记。
返回:
此缓冲区
reset
public final Buffer reset()
将此缓冲区的位置重置为以前标记的位置。
调用此方法不更改也不丢弃标记的值。
返回:
此缓冲区
抛出:
InvalidMarkException
- 如果尚未设置标记
<!-- -->
clear
public final Buffer clear()
清除此缓冲区。将位置设置为 0,将限制设置为容量,并丢弃标记。
在使用一系列通道读取或放置 操作填充此缓冲区之前调用此方法。例如:
buf.clear(); // Prepare buffer for reading
in.read(buf); // Read data
此方法不能实际清除缓冲区中的数据,但从名称来看它似乎能够这样做,这样命名是因为它多数情况下确实是在清除数据时使用。
返回:
此缓冲区
flip
public final Buffer flip()
反转此缓冲区。首先将限制设置为当前位置,然后将位置设置为 0。如果已定义了标记,则丢弃该标记。
在一系列通道读取或放置 操作之后,调用此方法为一系列通道写入或相对获取 操作做好准备。例如:
buf.put(magic); // Prepend header
in.read(buf); // Read data into rest of buffer
buf.flip(); // Flip buffer
out.write(buf); // Write header + data to channel
当将数据从一个地方传输到另一个地方时,经常将此方法与 compact
方法一起使用。
返回:
此缓冲区
<!-- -->
rewind
public final Buffer rewind()
重绕此缓冲区。将位置设置为 0 并丢弃标记。
在一系列通道写入或获取 操作之前调用此方法(假定已经适当设置了限制)。例如:
out.write(buf); // Write remaining data
buf.rewind(); // Rewind buffer
buf.get(array); // Copy data into array
返回:
此缓冲区
remaining
public final int remaining()
返回当前位置与限制之间的元素数。
返回:
此缓冲区中的剩余元素数
hasRemaining
public final boolean hasRemaining()
告知在当前位置和限制之间是否有元素。
返回:
当且仅当此缓冲区中至少还有一个元素时返回 true
分享到:
相关推荐
在Java编程语言中,`ByteBuffer`是Java NIO(New IO)框架中的核心类之一,它提供了一种高效处理字节数据的方式。本教程重点讲解了`ByteBuffer`的几个关键属性:mark、position、limit和capacity,以及重要的操作...
java.nio 中定义了 Buffer 及其数据类型相关的子类,而 java.nio.channels 中定义了一系列处理 IO 的 Channel 接口以及这些接口在文件系统和网络通讯上的实现。通过 Selector 这个类,还提供了进行非阻塞 IO 操作的...
在Java NIO中,Buffer类是所有其他缓冲类的基类,为所有缓冲器类型提供了通用方法。下面详细说明Java NIO中的主要类和方法。 Buffer类(C.1.1): Buffer类是一个抽象类,提供了缓冲区操作的基本结构。以下是一些...
4. **标记(mark)**:可以通过`mark()`方法记录当前位置,后续调用`reset()`可以回到标记的位置。 Buffer的常用操作包括`get()`和`put()`,它们分别用于读取和写入数据。子类如`ByteBuffer`、`CharBuffer`等针对不同...
Java NIO 是 JDK 1.4 中引入的新的 IO 方式,它主要包含 Buffer、Channel、Selector 三个核心的组件。 Java NIO 概述 ---------------- Java NIO 是 Java 编程语言中的一种新的 IO 模式,它与传统 IO 的区别在于...
在这个“java代码-buffer”的主题中,我们将深入探讨Buffer的概念、使用方法以及它在实际编程中的应用。 1. **Java NIO (New IO)** Java NIO是Java 1.4引入的一个新特性,旨在提供一种不同于传统IO模型的I/O方式。...
而NIO(New Input/Output)包中的`Buffer`和`Channel`接口则是对I/O操作进行更底层控制的工具。 - **异常处理**:I/O操作经常需要处理异常情况,`IOException`是处理I/O异常时最常遇到的异常类型。 - **控制台I/O*...
Java IO中的BufferedInputStream是Java I/O流处理中非常重要的一部分,它属于过滤输入流(FilterInputStream)的一个子类。BufferedInputStream的主要目的是提高输入流的读取效率,通过内部维护一个缓冲区来批量处理...
8. **高级流操作**:可能涉及到了缓冲区的大小设置,以及`mark()`和`reset()`方法进行数据回溯。 9. **文件复制**:使用流进行文件复制是常见的练习,源码可能包含这一部分,演示了如何从一个文件读取数据,然后...
【CharArrayReader】是Java IO库中的一个类,它专门用于读取字符数组。与`ByteArrayInputStream`不同,`CharArrayReader`处理的是字符数据,而`ByteArrayInputStream`处理的是字节数据。`CharArrayReader`继承自抽象...
Buffer提供了诸如clear、flip、rewind和mark等方法,用于管理和操作缓冲区中的数据。 2. **通道(Channel)**:通道类似于流,但它是双向的,可以进行读写操作。Java.nio.channels包中定义了多种类型的通道,如...
标记清除算法(Mark-Sweep)、复制算法(Copying)、标记整理算法(Mark-Compact)和分代收集算法是JVM中常见的垃圾回收算法。分代收集算法中,新生代使用复制算法,而老年代使用标记整理算法。 Java中还有四种引用...
缓冲区具有几个关键属性,比如容量(Capacity)、位置(Position)、限制(Limit)和标记(Mark),这些属性在读写过程中指示缓冲区的状态。 选择器(Selector)是NIO中用于实现单线程管理多个通道的机制。它允许一...
Java中的IO操作包括输入和输出操作,提供了一套标准的Java IO库供用户使用。 2.8.1 阻塞IO模型 在阻塞IO模型中,应用程序在进行I/O操作时,必须等待数据准备好后才能进行,期间线程会被阻塞。 2.8.2 非阻塞IO模型 ...
在Java API中,I/O流被组织为一系列类和接口,主要位于`java.io`包。在JDK 1.0中引入了字节流(byte stream),JDK 1.1则添加了字符流(char stream)。字节流处理数据单位为字节,而字符流处理的是Unicode字符,...
Java NIO提供了基于通道(Channel)和缓冲区(Buffer)的IO操作方式,允许非阻塞的读写操作,并且可以实现高效的网络通信和文件处理。 Java集合框架提供了一套性能良好的接口和类,用于表示和操作数据。主要的集合...
- 直接使用 put 方法写入 Buffer:`buf.put(111);` - **切换操作模式**:`buf.flip();` // 从写入模式切换到读取模式 - **读取 Buffer 中的数据**: - 向 Channel 写入数据:`int write = outChannel.write(buf);`...
- 使用`FileStream`打开源文件并读取其全部内容到`buffer`中。 - 创建目标文件的`FileStream`,并在此之上创建`GZipStream`实例,设置模式为`CompressionMode.Compress`,表示将进行压缩操作。 - 将缓冲区中的...
- 如果仍然未命中,则会从 IO Engine 中读取数据,并将数据块添加到 RAM Cache Map 和 Queue 中。 2. **第二次及以后使用流程**: - 当再次请求同一块时,首先会在 RAM Cache Map 中查找。 - 如果命中,则直接...