Java - StringReader mark(int readAheadLimit) method



Description

The Java StringReader mark(int readAheadLimit) method marks the present position in the stream. Subsequent calls to reset() will reposition the stream to this point.

Declaration

Following is the declaration for java.io.StringReader.mark(int readAheadLimit) method.

public void mark(int readAheadLimit)

Parameters

readAheadLimit − Limit on the number of characters that may be read while still preserving the mark. Because the stream's input comes from a string, there is no actual limit, so this argument must not be negative, but is otherwise ignored.

Return Value

This method does not return a value.

Exception

  • IllegalArgumentException − If readAheadLimit is < 0.

  • IOException − If an I/O error occurs.

Example - Usage of StringReader mark(int readAheadLimit) method

The following example shows the usage of StringReader mark(int readAheadLimit) method.

StringReaderDemo.java

package com.tutorialspoint;

import java.io.IOException;
import java.io.StringReader;

public class StringReaderDemo {
   public static void main(String[] args) {
      String s = "Hello World";

      // create a new StringReader
      StringReader sr = new StringReader(s);

      try {
         // read the first five chars
         for (int i = 0; i < 5; i++) {
            char c = (char) sr.read();
            System.out.print("" + c);
         }

         // mark the reader at position 5 for maximum 6
         sr.mark(6);

         // read the next six chars
         for (int i = 0; i < 6; i++) {
            char c = (char) sr.read();
            System.out.print("" + c);
         }

         // reset back to marked position
         sr.reset();

         // read again the next six chars
         for (int i = 0; i < 6; i++) {
            char c = (char) sr.read();
            System.out.print("" + c);
         }

         // close the stream
         sr.close();

      } catch (IOException ex) {
         ex.printStackTrace();
      }
   }
}

Output

Let us compile and run the above program, this will produce the following result −

Hello World World

Example - Basic use of mark() and reset()

The following example shows the usage of StringReader mark(int readAheadLimit) method.

StringReaderDemo.java

package com.tutorialspoint;

import java.io.StringReader;

public class StringReaderDemo {
   public static void main(String[] args) throws Exception {
      StringReader reader = new StringReader("abcdef");

      System.out.print((char) reader.read()); // a
      reader.mark(3); // mark at position after 'a'

      System.out.print((char) reader.read()); // b
      System.out.print((char) reader.read()); // c

      reader.reset(); // go back to mark (before 'b')

      System.out.print((char) reader.read()); // b
      System.out.print((char) reader.read()); // c

      reader.close();
   }
}

Output

Let us compile and run the above program, this will produce the following result−

abcbc

Explanation

  • You read 'a', then mark the position.

  • Then read 'b' and 'c'.

  • After reset(), you go back to the position after 'a' and read 'b' and 'c' again.

Example - Mark becomes invalid after reading beyond readAheadLimit

The following example shows the usage of StringReader mark(int readAheadLimit) method.

StringReaderDemo.java

package com.tutorialspoint;

import java.io.StringReader;

public class StringReaderDemo {
   public static void main(String[] args) {
      try {
         StringReader reader = new StringReader("123456");

         reader.read(); // '1'
         reader.mark(2); // mark after '1'

         reader.read(); // '2'
         reader.read(); // '3'
         reader.read(); // '4' -> readAheadLimit is 2, so this exceeds limit

         reader.reset(); // invalid, too much read after mark
         System.out.println("Reset successful.");
      } catch (Exception e) {
         System.out.println("Exception: " + e.getMessage());
      }
   }
}

Output

Let us compile and run the above program, this will produce the following result−

Reset successful.

Explanation

  • The mark(2) allows reading up to 2 characters after the mark.

  • We read 3 characters ('2', '3', '4') → limit exceeded.

  • So calling reset() throws an IOException with message "Mark invalid".

java_io_stringreader.htm
Advertisements