在 BufferedReader 中什么是标记和重置?

2022-09-01 15:38:09

我想知道有哪些方法和方法?如何使用它们?我读了Javadoc,但作为一个初学者,我无法理解它。mark()reset()BufferedReader


答案 1

流的 和 方法提供了一种在流中向后跳转并重新读取数据的方法。markreset

当您调用时,它将开始将您从该点读取的数据向前保留在其内部缓冲区中。当您调用它时,它将跳回到流的标记位置,因此内存中的缓冲区将满足下一个 s。当您读取超过该缓冲区的末尾时,它将无缝地返回到读取新数据。 工作方式相同。mark()BufferedReaderreset()read()BufferedInputStream

int 参数,用于告诉它您希望能够倒退的最大字符数(for )或字节数(for )。如果您读取过多数据超过标记的位置,则标记可能会“失效”,并且调用将失败并出现异常。markBufferedReaderBufferedInputStreamreset()

举个小例子:

BufferedReader r = new BufferedReader(new StringReader(
    "Happy Birthday to You!\n" +
    "Happy Birthday, dear " + System.getProperty("user.name") + "!"));
r.mark(1000); // save the data we are about to read
System.out.println(r.readLine()); // read the first line
r.reset(); // jump back to the marked position
r.mark(1000); // start saving the data again
System.out.println(r.readLine()); // read the first line again
System.out.println(r.readLine()); // read the second line
r.reset(); // jump back to the marked position
System.out.println(r.readLine()); // read the first line one final time

在该示例中,我将 包装在 a 中以获取该方法,但 s 已经支持并自行支持!从内存中数据源读取的流通常支持和自身,因为它们已经在内存中拥有所有数据,因此它们很容易再次读取它。从文件、管道或网络套接字读取的流自然不支持 和 ,但您始终可以通过将该功能包装在 或 中来将其添加到任何流中。StringReaderBufferedReaderreadLine()StringReadermarkresetmarkresetmarkresetBufferedInputStreamBufferedReader


答案 2

标记流中的特定点并将流重置为最新的标记。这些方法提供了一项功能,允许您在流中提前读取以检查即将发生的数据。mark()reset()book-marking

从本文档中:

mark() 方法标记输入中的一个位置,通过调用 reset() 方法可以将流“重置”到该位置。参数 readLimit 是在标记变为无效之前设置标记后可从流中读取的字符数。例如,如果以 10 的读取限制调用 mark(),则在调用 reset() 方法之前从流中读取 11 个字符的数据时,标记无效,并且流对象实例不需要记住该标记。请注意,此方法可以记住的字符数可以大于内部读取缓冲区的大小。它也不依赖于支持标记/重置功能的从属流。


推荐