code: package org.gridkit.jvmtool.stacktrace;
  
  import java.io.DataOutput;
  import java.io.IOException;
  import java.io.OutputStream;
  import java.util.Arrays;
  
  public class DataBuffer implements DataOutput {
  
      private byte[] buffer = new byte[512];
      private int size = 0;
      private java.io.DataOutputStream dos;
  
      public DataBuffer() {
          dos = new java.io.DataOutputStream(new StreamStub());
      }
  
      public void unloadTo(DataOutput out) throws IOException {
          out.write(buffer, 0, size);
          size = 0;
      }
  
      @Override
      public void write(int b) throws IOException {
          dos.write(b);
      }
  
      @Override
      public void write(byte[] b) throws IOException {
          dos.write(b);
      }
  
      @Override
      public void write(byte[] b, int off, int len) throws IOException {
          dos.write(b, off, len);
      }
  
      @Override
      public void writeBoolean(boolean v) throws IOException {
          dos.writeBoolean(v);
      }
  
      @Override
      public void writeByte(int v) throws IOException {
          dos.writeByte(v);
      }
  
      @Override
      public void writeShort(int v) throws IOException {
          dos.writeShort(v);
      }
  
      @Override
      public void writeChar(int v) throws IOException {
          dos.writeChar(v);
      }
  
      @Override
      public void writeInt(int v) throws IOException {
          dos.writeInt(v);
      }
  
      @Override
      public void writeLong(long v) throws IOException {
          dos.writeLong(v);
      }
  
      @Override
      public void writeFloat(float v) throws IOException {
          dos.writeFloat(v);
      }
  
      @Override
      public void writeDouble(double v) throws IOException {
          dos.writeDouble(v);
      }
  
      @Override
      public void writeBytes(String s) throws IOException {
          dos.writeBytes(s);
      }
  
      @Override
      public void writeChars(String s) throws IOException {
          dos.writeChars(s);
      }
  
      @Override
      public void writeUTF(String s) throws IOException {
          dos.writeUTF(s);
      }
  
      private class StreamStub extends OutputStream {
  
          @Override
          public void write(int b) throws IOException {
              ensureSize(size + 1);
              buffer[size] = (byte) b;
              size++;
          }
  
          @Override
          public void write(byte[] b, int off, int len) throws IOException {
              ensureSize(size + len);
              System.arraycopy(b, off, buffer, size, len);
              size += len;
          }
  
          private void ensureSize(int size) {
              while (buffer.length < size) {
                  buffer = Arrays.copyOf(buffer, 2 * buffer.length);
              }
          }
      }
  }
  