title: PushbackInputStream: Push back buffer is full
body: <p>Why I am getting the following exception:</p>
  
  <pre><code>Exception in thread "main" java.io.IOException: Push back buffer is full
      at java.io.PushbackInputStream.unread(PushbackInputStream.java:232)
      at java.io.PushbackInputStream.unread(PushbackInputStream.java:252)
      at org.tests.io.PushBackStream_FUN.read(PushBackStream_FUN.java:32)
      at org.tests.io.PushBackStream_FUN.main(PushBackStream_FUN.java:43)
  </code></pre>
  
  <p>In this code:</p>
  
  <pre><code>public class PushBackStream_FUN {
      public int write(String outFile) throws Exception {
          FileOutputStream outputStream = new FileOutputStream(new File(outFile));
          String str = new String("Hello World");
          byte[] data = str.getBytes();
          outputStream.write(data);
          outputStream.close();
  
          return data.length;
      }
  
      public void read(String inFile, int ln) throws Exception {
          PushbackInputStream inputStream = new PushbackInputStream(new FileInputStream(new File(inFile)));
          byte[] data = new byte[ln];
          String str;
  
          // read
          inputStream.read(data);
          str = new String(data);
          System.out.println("MSG_0 = "+str);
          // unread
          inputStream.unread(data);
          // read
          inputStream.read(data);
          str = new String(data);
          System.out.println("MSG_1 = "+str);
      }
  
      public static void main(final String[] args) throws Exception {
          PushBackStream_FUN fun = new PushBackStream_FUN();
          String path = "aome/path/output_PushBack_FUN";
          int ln = fun.write(path);
          fun.read(path, ln);
      }
  }
  </code></pre>
  
  <p><strong>UPDATE</strong></p>
  
  <p>Think this is the solution. Java sources to the rescue. I have made some "experiments". It turns out that when I specify <code>PushbackInputStream</code> with a specified buffer size it works. The java sources tells me this:</p>
  
  <pre><code>public PushbackInputStream(InputStream in) {
          this(in, 1);
      }
  
  public PushbackInputStream(InputStream in, int size) {
          super(in);
          if (size &lt;= 0) {
              throw new IllegalArgumentException("size &lt;= 0");
          }
          this.buf = new byte[size];
          this.pos = size;
      }
  </code></pre>
  
  <p>I think that if you use <code>PushbackInputStream</code> with constrcutor that uses default buffer size, you can only unread single byte. I am unreading more than single byte, thus the exception.</p>