Java - PushbackReader class



Introduction

The Java PushbackReader class is a character-stream reader that allows characters to be pushed back into the stream.

Class declaration

Following is the declaration for Java.io.PushbackReader class −

public class PushbackReader
   extends FilterReader

Field

Following are the fields for Java.io.PushbackReader class −

  • protected Reader in − This is the character-input stream.

  • protected Object lock − This is the object used to synchronize operations on this stream.

Class constructors

Sr.No.Constructor & Description
1

PushbackReader(Reader in)

This creates a new pushback reader with a one-character pushback buffer.

2

PushbackReader(Reader in, int size)

This creates a new pushback reader with a pushback buffer of the given size.

Class methods

Sr.No.Method & Description
1void close()

This method closes the stream and releases any system resources associated with it.

2void mark(int readAheadLimit)

This method marks the present position in the stream.

3boolean markSupported()

This method tells whether this stream supports the mark() operation, which it does not.

4int read()

This method reads a single character.

5int read(char[] cbuf, int off, int len)

This method reads characters into a portion of an array.

6boolean ready()

This method tells whether this stream is ready to be read.

7void reset()

This method resets the stream.

8long skip(long n)

This method skips characters.

9void unread(char[] cbuf)

This method pushes back an array of characters by copying it to the front of the pushback buffer.

10void unread(char[] cbuf, int off, int len)

This method pushes back a portion of an array of characters by copying it to the front of the pushback buffer.

11void unread(int c)

This method pushes back a single character by copying it to the front of the pushback buffer.

Methods inherited

This class inherits methods from the following classes −

  • Java.io.Reader
  • Java.io.Object

Example - Properly closing a PushbackReader

The following example shows the usage of PushbackReader close() method.

PushbackReaderDemo.java

package com.tutorialspoint;

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

public class PushbackReaderDemo {
   public static void main(String[] args) {
      try (PushbackReader reader = new PushbackReader(new StringReader("Hello, Java!"))) {
         int ch = reader.read();
         System.out.println("First character read: " + (char) ch); // Output: H

         // Push the character back
         reader.unread(ch);

         // Read it again
         System.out.println("After unread: " + (char) reader.read()); // Output: H

         // The reader will be automatically closed here due to try-with-resources
      } catch (IOException e) {
         e.printStackTrace();
      }
   }
}

Output

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

First character read: H
After unread: H

Explanation

  • Uses try-with-resources to ensure close() is automatically called at the end.

  • Proper resource handling without explicitly calling close().

Example - Directly calling mark() on PushbackReader

The following example shows the usage of PushbackReader markSupported() method.

PushbackReaderDemo.java

package com.tutorialspoint;

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

public class PushbackReaderDemo {
   public static void main(String[] args) {
      try (PushbackReader reader = new PushbackReader(new StringReader("Hello, world!"))) {
         System.out.println("markSupported: " + reader.markSupported()); // false

         reader.mark(10); // This line will throw IOException
      } catch (IOException e) {
         System.out.println("Exception caught: " + e.getMessage());
      }
   }
}

Output

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

markSupported: false
Exception caught: mark/reset not supported

Example - Attempting Mark Without Checking markSupported()

The following example shows the usage of PushbackReader markSupported() method.

PushbackReaderDemo.java

package com.tutorialspoint;

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

public class PushbackReaderDemo {
   public static void main(String[] args) {
      try (PushbackReader reader = new PushbackReader(new StringReader("World"))) {
         System.out.println("markSupported: " + reader.markSupported()); // false

         // Attempting to mark anyway – will throw IOException
         reader.mark(5); 
      } catch (IOException e) {
         System.out.println("Exception occurred: " + e.getMessage());
      }
   }
}

Output

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

markSupported: false  
Exception occurred: mark/reset not supported

Explanation

  • Shows how skipping markSupported() leads to an exception.

  • Demonstrates the importance of checking before calling mark().