Class LoggingByteArrayOutputStream

  • All Implemented Interfaces:
    java.io.Closeable, java.io.Flushable, java.lang.AutoCloseable

    public class LoggingByteArrayOutputStream
    extends java.io.ByteArrayOutputStream
    Thread-safe byte array output stream that logs what was written to it when the stream is closed.

    Use this as a safe way to log a limited amount of content. As content is written to the stream, it is stored as a byte array, up to the maximum number of bytes limit that was set in the constructor. Note that if the maximum limit is set too high, it risks an OutOfMemoryError on low-memory devices. This class also keeps track of the total number of bytes written, regardless of whether they were logged. On close(), it then logs two records to the specified logger and logging level: the total number of bytes written, and the bounded content logged (assuming charset "UTF-8"). Any control characters are stripped out of the content.

    Since:
    1.9
    • Field Summary

      Fields 
      Modifier and Type Field Description
      private int bytesWritten
      Bytes written to the stream (may or may not have been logged).
      private boolean closed
      Whether the stream has already been closed.
      private java.util.logging.Logger logger
      Logger.
      private java.util.logging.Level loggingLevel
      Logging level.
      private int maximumBytesToLog
      Maximum number of bytes to log (may be 0 to avoid logging content).
      • Fields inherited from class java.io.ByteArrayOutputStream

        buf, count
    • Constructor Summary

      Constructors 
      Constructor Description
      LoggingByteArrayOutputStream​(java.util.logging.Logger logger, java.util.logging.Level loggingLevel, int maximumBytesToLog)  
    • Method Summary

      All Methods Static Methods Instance Methods Concrete Methods 
      Modifier and Type Method Description
      private static void appendBytes​(java.lang.StringBuilder buf, int x)  
      void close()  
      int getBytesWritten()
      Returns the bytes written to the stream (may or may not have been logged).
      int getMaximumBytesToLog()
      Returns the maximum number of bytes to log (may be 0 to avoid logging content).
      void write​(byte[] b, int off, int len)  
      void write​(int b)  
      • Methods inherited from class java.io.ByteArrayOutputStream

        reset, size, toByteArray, toString, toString, toString, writeTo
      • Methods inherited from class java.io.OutputStream

        flush, write
      • Methods inherited from class java.lang.Object

        clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
    • Field Detail

      • bytesWritten

        private int bytesWritten
        Bytes written to the stream (may or may not have been logged).
      • maximumBytesToLog

        private final int maximumBytesToLog
        Maximum number of bytes to log (may be 0 to avoid logging content).
      • closed

        private boolean closed
        Whether the stream has already been closed.
      • loggingLevel

        private final java.util.logging.Level loggingLevel
        Logging level.
      • logger

        private final java.util.logging.Logger logger
        Logger.
    • Constructor Detail

      • LoggingByteArrayOutputStream

        public LoggingByteArrayOutputStream​(java.util.logging.Logger logger,
                                            java.util.logging.Level loggingLevel,
                                            int maximumBytesToLog)
        Parameters:
        logger - logger
        loggingLevel - logging level
        maximumBytesToLog - maximum number of bytes to log (may be 0 to avoid logging content)
    • Method Detail

      • write

        public void write​(int b)
        Overrides:
        write in class java.io.ByteArrayOutputStream
      • write

        public void write​(byte[] b,
                          int off,
                          int len)
        Overrides:
        write in class java.io.ByteArrayOutputStream
      • close

        public void close()
                   throws java.io.IOException
        Specified by:
        close in interface java.lang.AutoCloseable
        Specified by:
        close in interface java.io.Closeable
        Overrides:
        close in class java.io.ByteArrayOutputStream
        Throws:
        java.io.IOException
      • getMaximumBytesToLog

        public final int getMaximumBytesToLog()
        Returns the maximum number of bytes to log (may be 0 to avoid logging content).
      • getBytesWritten

        public final int getBytesWritten()
        Returns the bytes written to the stream (may or may not have been logged).
      • appendBytes

        private static void appendBytes​(java.lang.StringBuilder buf,
                                        int x)