Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

InputStream, mark(), reset()

Tags:

java

java-io

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 &copy 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);
        }
    }
}
like image 970
ashur Avatar asked Nov 02 '12 14:11

ashur


People also ask

What is Mark and reset in InputStream?

The InputStream class has two methods called mark() and reset() which subclasses of InputStream may or may not support. If an InputStream subclass supports the mark() and reset() methods, then that subclass should override the markSupported() to return true .

What does InputStream Reset do?

The java. io. InputStream. reset() method repositions this stream to the position at the time the mark method was last called on this input stream.

What is Mark and reset in Java?

Assuming the stream does support marking, the mark() method places a bookmark at the current position in the stream. You can rewind the stream to this position later with reset() as long as you haven't read more than readLimit bytes. There can be only one mark in the stream at any given time.

How do you use InputStream marks?

mark(int readlimit) method marks the current position in this input stream. A subsequent invocation to the reset() method reposition the stream to the recently marked position.


1 Answers

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.

like image 151
dan Avatar answered Oct 22 '22 05:10

dan