Search code examples
javaandroidregexstreaminputstream

Change InputStream by applying regex on it


I have an InputStream downloaded from the internet. And I need to apply regex on it - so that all occurrences of that regex would be changed to string, which is provided. I need an InputStream as a return value since it should be forwarded to an API.

Basically, such signature would be the best:

InputStream applyRegex(InputStream stream, Pattern pattern, String changeString){
    ...
}

I have very basic knowledge of working with streams, please give an answer in method form, if it is possible.

By the way, input stream I receive has size 0, until I call method read(byte[])


Solution

  • Managed to get it working with github.com/rwitzel/streamflyer library. if app.gradle we have:

    compile 'com.github.rwitzel.streamflyer:streamflyer-core:1.2.0';
    

    Example:

    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.Reader;
    import java.io.UnsupportedEncodingException;
    import java.nio.charset.Charset;
    
    import org.apache.commons.io.IOUtils;
    import org.apache.commons.io.input.ReaderInputStream;
    
    import com.github.rwitzel.streamflyer.core.ModifyingReader;
    import com.github.rwitzel.streamflyer.regex.RegexModifier;
    
    public class InputStreamModifiedWithRegex {
        private static final Charset ENCODE_CHARSET = Charset.forName("UTF-8");
    
        public static void main(String[] args) throws IOException {
            InputStream input = IOUtils.toInputStream("AB CD EF");
            InputStream updatedInput = applyRegex(input, "[A-C]", "Z");
            System.out.println(IOUtils.toString(updatedInput, ENCODE_CHARSET));
        }
    
        private static InputStream applyRegex(InputStream inputStream, String pattern, String changeString)
                throws UnsupportedEncodingException {
            Reader originalReader = new InputStreamReader(inputStream, ENCODE_CHARSET);
            Reader modifyingReader = new ModifyingReader(originalReader, new RegexModifier(pattern, 0, changeString));
            inputStream = new ReaderInputStream(modifyingReader, ENCODE_CHARSET);
    
            return inputStream;
        }
    }