code: @Override
      public int read(byte[] bts) throws IOException {
          try {
              beforeRead(bts != null ? bts.length : 0);
              int n = in.read(bts);
              afterRead(n);
              return n;
          } catch (IOException e) {
              handleIOException(e);
              return -1;
          }
      }
docs: Invokes the delegate's <code>read(byte[])</code> method.
  
  @param bts the buffer to read the bytes into
  @return the number of bytes read or -1 if the end of stream
  @throws java.io.IOException if an I/O error occurs