Class StringSubstitutorReader

java.lang.Object
java.io.Reader
java.io.FilterReader
org.apache.commons.text.io.StringSubstitutorReader
All Implemented Interfaces:
Closeable, AutoCloseable, Readable

public class StringSubstitutorReader extends FilterReader
A Reader that performs string substitution on a source Reader using a StringSubstitutor.

Using this Reader avoids reading a whole file into memory as a String to perform string substitution, for example, when a Servlet filters a file to a client.

This class is not thread-safe.

Since:
1.9
  • Field Summary

    Fields
    Modifier and Type
    Field
    Description
    private final TextStringBuilder
    Our internal buffer.
    private boolean
    End-of-Stream flag.
    private static final int
    The end-of-stream character marker.
    private final StringMatcher
    Matches escaped variable starts.
    private final char[]
    Internal buffer for read() method.
    private final StringSubstitutor
    The underlying StringSubstitutor.
    private int
    We don't always want to drain the whole buffer.

    Fields inherited from class java.io.FilterReader

    in

    Fields inherited from class java.io.Reader

    lock
  • Constructor Summary

    Constructors
    Constructor
    Description
    StringSubstitutorReader(Reader reader, StringSubstitutor stringSubstitutor)
    Constructs a new instance.
  • Method Summary

    Modifier and Type
    Method
    Description
    private int
    buffer(int requestReadCount)
    Buffers the requested number of characters if available.
    private int
    bufferOrDrainOnEos(int requestReadCount, char[] target, int targetIndex, int targetLength)
    Reads a requested number of chars from the underlying reader into the buffer.
    private int
    drain(char[] target, int targetIndex, int targetLength)
    Drains characters from our buffer to the given target.
    private int
    drainOnEos(int readCountOrEos, char[] target, int targetIndex, int targetLength)
    Drains from the buffer to the target only if we are at EOS per the input count.
    private boolean
    isBufferMatchAt(StringMatcher stringMatcher, int pos)
    Tests if our buffer matches the given string matcher at the given position in the buffer.
    private boolean
    Tests if we are draining.
    int
    Reads a single character.
    int
    read(char[] target, int targetIndexIn, int targetLengthIn)
    Reads characters into a portion of an array.
    private int
    readCount(int count, int pos)
    Returns how many chars to attempt reading to have room in the buffer for count chars starting at position pos.

    Methods inherited from class java.io.FilterReader

    close, mark, markSupported, ready, reset, skip

    Methods inherited from class java.io.Reader

    read, read

    Methods inherited from class java.lang.Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • Field Details

    • EOS

      private static final int EOS
      The end-of-stream character marker.
      See Also:
    • buffer

      private final TextStringBuilder buffer
      Our internal buffer.
    • eos

      private boolean eos
      End-of-Stream flag.
    • prefixEscapeMatcher

      private final StringMatcher prefixEscapeMatcher
      Matches escaped variable starts.
    • read1CharBuffer

      private final char[] read1CharBuffer
      Internal buffer for read() method.
    • stringSubstitutor

      private final StringSubstitutor stringSubstitutor
      The underlying StringSubstitutor.
    • toDrain

      private int toDrain
      We don't always want to drain the whole buffer.
  • Constructor Details

    • StringSubstitutorReader

      public StringSubstitutorReader(Reader reader, StringSubstitutor stringSubstitutor)
      Constructs a new instance.
      Parameters:
      reader - the underlying reader containing the template text known to the given StringSubstitutor.
      stringSubstitutor - How to replace as we read.
      Throws:
      NullPointerException - if reader is null.
      NullPointerException - if stringSubstitutor is null.
  • Method Details

    • buffer

      private int buffer(int requestReadCount) throws IOException
      Buffers the requested number of characters if available.
      Throws:
      IOException
    • bufferOrDrainOnEos

      private int bufferOrDrainOnEos(int requestReadCount, char[] target, int targetIndex, int targetLength) throws IOException
      Reads a requested number of chars from the underlying reader into the buffer. On EOS, set the state is DRAINING, drain, and return a drain count, otherwise, returns the actual read count.
      Throws:
      IOException
    • drain

      private int drain(char[] target, int targetIndex, int targetLength)
      Drains characters from our buffer to the given target.
    • drainOnEos

      private int drainOnEos(int readCountOrEos, char[] target, int targetIndex, int targetLength)
      Drains from the buffer to the target only if we are at EOS per the input count. If input count is EOS, drain and returns the drain count, otherwise return the input count. If draining, the state is set to DRAINING.
    • isBufferMatchAt

      private boolean isBufferMatchAt(StringMatcher stringMatcher, int pos)
      Tests if our buffer matches the given string matcher at the given position in the buffer.
    • isDraining

      private boolean isDraining()
      Tests if we are draining.
    • read

      public int read() throws IOException
      Reads a single character.
      Overrides:
      read in class FilterReader
      Returns:
      a character as an int or -1 for end-of-stream.
      Throws:
      IOException - If an I/O error occurs
    • read

      public int read(char[] target, int targetIndexIn, int targetLengthIn) throws IOException
      Reads characters into a portion of an array.
      Overrides:
      read in class FilterReader
      Parameters:
      target - Target buffer.
      targetIndexIn - Index in the target at which to start storing characters.
      targetLengthIn - Maximum number of characters to read.
      Returns:
      The number of characters read, or -1 on end of stream.
      Throws:
      IOException - If an I/O error occurs
    • readCount

      private int readCount(int count, int pos)
      Returns how many chars to attempt reading to have room in the buffer for count chars starting at position pos.