X-Git-Url: http://git.nikiroo.be/?a=blobdiff_plain;f=src%2Fbe%2Fnikiroo%2Futils%2Fstreams%2FReplaceInputStream.java;fp=src%2Fbe%2Fnikiroo%2Futils%2Fstreams%2FReplaceInputStream.java;h=5eac0b448fef0262b9f2ded53a4c199a2c41d0b7;hb=8e76f6ab13a8a4a651f2518b6c91d5e6424c7922;hp=0000000000000000000000000000000000000000;hpb=a26188d393b11040b8ee8476338a73bfadabffb6;p=fanfix.git diff --git a/src/be/nikiroo/utils/streams/ReplaceInputStream.java b/src/be/nikiroo/utils/streams/ReplaceInputStream.java new file mode 100644 index 0000000..5eac0b4 --- /dev/null +++ b/src/be/nikiroo/utils/streams/ReplaceInputStream.java @@ -0,0 +1,101 @@ +package be.nikiroo.utils.streams; + +import java.io.IOException; +import java.io.InputStream; +import java.io.UnsupportedEncodingException; + +/** + * This {@link InputStream} will replace some of its content by replacing it + * with something else. + * + * @author niki + */ +public class ReplaceInputStream extends BufferedInputStream { + private byte[] from; + private byte[] to; + + private byte[] source; + private int spos; + private int slen; + + /** + * Create a {@link ReplaceInputStream} that will replace from with + * to. + * + * @param in + * the under-laying {@link InputStream} + * @param from + * the {@link String} to replace + * @param to + * the {@link String} to replace with + */ + public ReplaceInputStream(InputStream in, String from, String to) { + this(in, bytes(from), bytes(to)); + } + + /** + * Create a {@link ReplaceInputStream} that will replace from with + * to. + * + * @param in + * the under-laying {@link InputStream} + * @param from + * the value to replace + * @param to + * the value to replace with + */ + public ReplaceInputStream(InputStream in, byte[] from, byte[] to) { + super(in); + this.from = from; + this.to = to; + + source = new byte[4096]; + spos = 0; + slen = 0; + } + + @Override + protected int read(InputStream in, byte[] buffer) throws IOException { + if (buffer.length < to.length || source.length < to.length * 2) { + throw new IOException( + "An underlaying buffer is too small for this replace value"); + } + + if (spos >= slen) { + spos = 0; + slen = in.read(source); + } + + // Note: very simple, not efficient implementation, sorry. + int count = 0; + while (spos < slen && count < buffer.length - to.length) { + if (from.length > 0 && startsWith(from, source, spos, slen)) { + System.arraycopy(to, 0, buffer, spos, to.length); + count += to.length; + spos += from.length; + } else { + buffer[count++] = source[spos++]; + } + } + + return count; + } + + /** + * Return the bytes array representation of the given {@link String} in + * UTF-8. + * + * @param str + * the string to transform into bytes + * @return the content in bytes + */ + static private byte[] bytes(String str) { + try { + return str.getBytes("UTF-8"); + } catch (UnsupportedEncodingException e) { + // All conforming JVM must support UTF-8 + e.printStackTrace(); + return null; + } + } +}