How are mark()
and reset()
methods working exactly(in code below), step by step ? I tried to write my own example but is starts to throw wrong mark exception or similar to that, and I cannot understand what is the point of placing mark and reset methods in this code because I don't see difference with this or without.
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);
}
}
}
When f.mark(32);
is reached the read cursor is already after &
, and a marker is set for reset
to know where to jump back. So when you have detected that a ;
is missing to close the element, you are manually printing &
and moving the read cursor right back (after &
where the marker was placed, using the mark(32)
call), using the reset
method. On the next read, because your marked
variable is not set it will print the characters.
mark(32)
means to automatically remove the marker if your read cursor will advance more then 32 character. This may be the issue in your other code, that is triggering an error, because the marker was invalidated already.