mark()
和reset()
方法如何正常工作(在下面的代码中),一步一步?我试着写自己的例子,但是开始抛出错误的标记异常或类似的东西,我无法理解在这段代码中放置标记和重置方法有什么意义,因为我没有看到这个或没有区别。< / p>
import java.io.*;
class BufferedInputStreamDemo {
public static void main(String args[]) {
String s = "© is a copyright symbol, "
+ "however © isn't.\n";
byte buf[] = s.getBytes();
ByteArrayInputStream in = new ByteArrayInputStream(buf);
int c;
boolean marked = false;
//try_with_resources
try (BufferedInputStream f = new BufferedInputStream(in)) {
while ((c = f.read()) != -1) {
switch (c) {
case '&':
if (!marked) {
f.mark(32);
marked = true;
} else {
marked = false;
}
break;
case ';':
if (marked) {
marked = false;
System.out.print("(c)");
} else
System.out.print((char) c);
break;
case ' ':
if (marked) {
marked = false;
f.reset();
System.out.print("&");
} else
System.out.print((char) c);
break;
default:
if (!marked)
System.out.print((char) c);
break;
}
}
} catch (IOException e) {
System.out.println("I/O Error: " + e);
}
}
}
答案 0 :(得分:7)
当达到f.mark(32);
时,读取光标已经在&
之后,并且为reset
设置了一个标记,以便知道在哪里跳回。因此,当您检测到关闭元素时缺少;
时,您手动打印&
并将读取光标向后移动(放置标记的&
之后),使用使用mark(32)
方法调用reset
。在下一次阅读时,因为未设置marked
变量,它将打印字符。
mark(32)
表示如果您的读取光标超过32个字符,则自动删除标记。这可能是您的其他代码中的问题,即触发错误,因为标记已经失效。
答案 1 :(得分:5)
请参阅API文档:
<强> mark(int)
强>
标记此输入流中的当前位置。随后对reset方法的调用会在最后标记的位置重新定位此流,以便后续读取重新读取相同的字节。
readlimit参数告诉此输入流允许在标记位置失效之前读取多个字节。
此方法只执行in.mark(readlimit)。
<强> reset()
强>
将此流重新定位到上次在此输入流上调用mark方法时的位置。
此方法只执行in.reset()。
流标记旨在用于需要提前阅读以查看流中的内容的情况。通常,这通过调用一些通用解析器最容易完成。如果流是由解析处理的类型,那么它只是愉快地开始。如果流不是该类型,则解析器应在失败时抛出异常。如果这发生在readlimit字节内,它允许外部代码重置流并尝试另一个解析器。