Java - PushbackInputStream read(byte[] b,int off,int len) method



Description

The Java PushbackInputStream read(byte[] b,int off,int len) method reads up to len bytes of data from this input stream into an array of bytes. This method first reads any pushed-back bytes; after that, if fewer than len bytes have been read then it reads from the underlying input stream. If len is not zero, the method blocks until at least 1 byte of input is available; otherwise, no bytes are read and 0 is returned.

read(byte[] b,int off,int len) method −

  • Reads up to len bytes of data from the input stream into an array b, starting at offset off.

  • Returns the number of bytes read, or -1 if the end of the stream is reached.

  • Commonly used when you want to fill part of a buffer, not necessarily from the start.

Declaration

Following is the declaration for java.io.PushbackInputStream.read(byte[] b,int off,int len) method.

public int read(byte[] b,int off,int len)

Parameters

  • b − The buffer into which the data is read.

  • off − The start offset in the destination array b.

  • len − The maximum number of bytes read.

Return Value

This method returns the total number of bytes read into the buffer, or -1 if there is no more data because the end of the stream has been reached.

Exception

  • NullPointerException − If b is null.

  • IndexOutOfBoundsException − If off is negative, len is negative, or len is greater than b.length - off.

  • IOException − If this input stream has been closed by invoking its close() method, or an I/O error occurs.

Example - Usage of PushbackInputStream read(byte[] b,int off,int len) method

The following example shows the usage of PushbackInputStream read(byte[] b,int off,int len) method.

PushbackInputStreamDemo.java

package com.tutorialspoint;

import java.io.*;

public class PushbackInputStreamDemo {
   public static void main(String[] args) {

      // declare a buffer and initialize its size:
      byte[] arrByte = new byte[1024];

      // create an array for our message
      byte[] byteArray = new byte[]{'H', 'e', 'l', 'l', 'o'};

      // create object of PushbackInputStream class for specified stream
      InputStream is = new ByteArrayInputStream(byteArray);
      PushbackInputStream pis = new PushbackInputStream(is);

      try {
         // read a char into our array
         pis.read(arrByte, 0, 3);

         // print arrByte
         for (int i = 0; i < 3; i++) {
            System.out.print((char) arrByte[i]);
         }
      } catch (Exception ex) {
         ex.printStackTrace();
      }
   }
}

Output

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

Hel

Example - Read into middle of a buffer

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

PushbackInputStreamDemo.java

package com.tutorialspoint;

import java.io.ByteArrayInputStream;
import java.io.PushbackInputStream;
import java.io.IOException;

public class PushbackInputStreamDemo {
   public static void main(String[] args) throws IOException {
      byte[] data = "HELLO".getBytes();  // Source stream

      try (PushbackInputStream pbis = new PushbackInputStream(new ByteArrayInputStream(data))) {
         byte[] buffer = new byte[10]; // Larger buffer than needed

         // Read 3 bytes into buffer starting at offset 2
         int bytesRead = pbis.read(buffer, 2, 3);

         System.out.println("Bytes read: " + bytesRead);              // Output: 3
         System.out.println("Buffer content: " + new String(buffer)); // Output shows nulls + 'HEL'
      }
   }
}

Output

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

Bytes read: 3
Buffer content:   HEL

Explanation

  • Only 3 bytes are read (H, E, L).

  • They're placed in buffer[2], buffer[3], and buffer[4].

  • The rest of the buffer contains default zero values.

Example - Combine unread and read with offset

The following example shows the usage of PushbackInputStream read(byte[] b,int off,int len) method.

PushbackInputStreamDemo.java

package com.tutorialspoint;

import java.io.ByteArrayInputStream;
import java.io.PushbackInputStream;
import java.io.IOException;

public class PushbackInputStreamDemo {
   public static void main(String[] args) throws IOException {
      byte[] data = "JAVAIO".getBytes();

      try (PushbackInputStream pbis = new PushbackInputStream(new ByteArrayInputStream(data), 10)) {
         byte[] buffer = new byte[6];

         // Read first 4 bytes
         pbis.read(buffer, 0, 4); // J A V A
         System.out.println("First read: " + new String(buffer, 0, 4)); // Output: JAVA

         // Unread last 2 bytes (V and A)
         pbis.unread(buffer, 2, 2);

         // Read next 3 bytes into buffer starting at index 3
         pbis.read(buffer, 3, 3); // V A I

         System.out.println("Final buffer: " + new String(buffer)); // Output: JAVAI_
      }
   }
}

Output

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

First read: JAVA
Final buffer: JAVVAI

Explanation

  • First read: JAVA.

  • Unread 'V' and 'A'.

  • Read 3 more bytes into the middle of the buffer (buffer[3], buffer[4], buffer[5]): VAI.

java_io_pushbackinputstream.htm
Advertisements