sau*_*anu 22 java stream bufferedreader
我想知道有什么mark()和reset()方法BufferedReader?我该如何使用它们?我读过Javadoc,但作为初学者,我无法理解它.
Boa*_*ann 15
在mark与reset流的方法提供了一种在流中反向跳转并重新读取数据.
当你打电话mark()给BufferedReader它时,它会开始将你从该点读取的数据保存在其内部缓冲区中.当你调用reset()它时会跳回到流的标记位置,因此read()内存缓冲区将满足下一个s.当您阅读该缓冲区的末尾时,它将无缝地返回读取新数据.BufferedInputStream以同样的方式工作.
int参数mark告诉它你希望能够倒退的最大字符数(for BufferedReader)或字节数(for BufferedInputStream).如果您在标记位置之后读取了太多数据,则标记可能会"无效",并且调用reset()将失败并出现异常.
一个小例子:
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
Run Code Online (Sandbox Code Playgroud)
在那个例子中,我包含了StringReader一个BufferedReader来获取readLine()方法,但是StringReader已经支持mark并且reset自己了!从一个读操作流在内存中的数据源通常支持mark和reset自己,因为他们已经有了所有的数据在内存中,所以很容易让他们看了一遍.从文件或管道或网络套接字读取流不自然支持mark和reset,但你总是可以通过在包装它是功能添加到任何流BufferedInputStream或BufferedReader.
Reader::mark(int readLimit) 文件说:
在此阅读器中设置标记位置.参数readLimit指示在标记无效之前可以读取的字符数.如果未超过readLimit,则调用reset()会将阅读器重新定位回标记位置.
例:
import java.io.*;
import static java.lang.System.out;
public class App {
public static final String TEST_STR = "Line 1\nLine 2\nLine 3\nLine 4\n";
public static void main(String[] args) {
try (BufferedReader in = new BufferedReader(new StringReader(TEST_STR))) {
// first check if this Reader support mark operation
if (in.markSupported()) {
out.println(in.readLine());
in.mark(0); // mark 'Line 2'
out.println(in.readLine());
out.println(in.readLine());
in.reset(); // reset 'Line 2'
out.println(in.readLine());
in.reset(); // reset 'Line 2'
out.println(in.readLine());
in.mark(0); // mark 'Line 3'
out.println(in.readLine());
in.reset(); // reset 'Line 3'
out.println(in.readLine());
out.println(in.readLine());
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
Line 1
Line 2
Line 3
Line 2
Line 2
Line 3
Line 3
Line 4
Run Code Online (Sandbox Code Playgroud)
阅读器界面不会让你返回,你可以直接阅读。另一方面,BufferedReader 创建一个缓冲区,因此您可以在读取时返回一点。这就是这些方法的用途。
使用 mark() 方法,您可以将“标记”放置到某个位置,然后您可以继续阅读。一旦你意识到你想要返回标记的位置,你可以使用reset()来实现。从那时起,您再次读取相同的值。您可以将其用于任何您想要的用途。
| 归档时间: |
|
| 查看次数: |
35859 次 |
| 最近记录: |