package be.nikiroo.utils.streams; import java.io.IOException; import java.io.OutputStream; /** * This {@link OutputStream} will change some of its content by replacing it * with something else. * * @author niki */ public class ReplaceOutputStream extends BufferedOutputStream { private byte[] from; private byte[] to; /** * Create a {@link ReplaceOutputStream} that will replace from with * to. * * @param out * the under-laying {@link OutputStream} * @param from * the {@link String} to replace * @param to * the {@link String} to replace with */ public ReplaceOutputStream(OutputStream out, String from, String to) { this(out, StreamUtils.bytes(from), StreamUtils.bytes(to)); } /** * Create a {@link ReplaceOutputStream} that will replace from with * to. * * @param out * the under-laying {@link OutputStream} * @param from * the value to replace * @param to * the value to replace with */ public ReplaceOutputStream(OutputStream out, byte[] from, byte[] to) { super(out); bypassFlush = false; this.from = from; this.to = to; } @Override protected void flush(boolean includingSubStream) throws IOException { // Note: very simple, not efficient implementation, sorry. while (start < stop) { if (from.length > 0 && StreamUtils.startsWith(from, buffer, start, stop)) { out.write(to); bytesWritten += to.length; start += from.length; } else { out.write(buffer[start++]); bytesWritten++; } } start = 0; stop = 0; if (includingSubStream) { out.flush(); } } }