X-Git-Url: http://git.nikiroo.be/?p=nikiroo-utils.git;a=blobdiff_plain;f=src%2Fbe%2Fnikiroo%2Futils%2Fstreams%2FReplaceInputStream.java;h=5332e72d11651cb7da0588e817bbb10310a39449;hp=b2187af09ce189dae52105733c10559f0db4aff0;hb=7194ac50b29064a013f177fc9cfc5aaa131a8ec4;hpb=a6a73de36765b85947ac885529da82d3e7189269 diff --git a/src/be/nikiroo/utils/streams/ReplaceInputStream.java b/src/be/nikiroo/utils/streams/ReplaceInputStream.java index b2187af..5332e72 100644 --- a/src/be/nikiroo/utils/streams/ReplaceInputStream.java +++ b/src/be/nikiroo/utils/streams/ReplaceInputStream.java @@ -10,8 +10,18 @@ import java.io.InputStream; * @author niki */ public class ReplaceInputStream extends BufferedInputStream { + /** + * The minimum size of the internal buffer (could be more if at least one of + * the 'FROM' bytes arrays is > 2048 bytes — in that case the + * buffer will be twice the largest size of the 'FROM' bytes arrays). + *

+ * This is a different buffer than the one from the inherited class. + */ + static private final int MIN_BUFFER_SIZE = 4096; + private byte[][] froms; private byte[][] tos; + private int maxFromSize; private int maxToSize; private byte[] source; @@ -91,11 +101,18 @@ public class ReplaceInputStream extends BufferedInputStream { this.froms = froms; this.tos = tos; + maxFromSize = 0; + for (int i = 0; i < froms.length; i++) { + maxFromSize = Math.max(maxFromSize, froms[i].length); + } + + maxToSize = 0; for (int i = 0; i < tos.length; i++) { maxToSize = Math.max(maxToSize, tos[i].length); } - source = new byte[4096]; + // We need at least maxFromSize so we can iterate and replace + source = new byte[Math.max(2 * maxFromSize, MIN_BUFFER_SIZE)]; spos = 0; slen = 0; } @@ -108,12 +125,13 @@ public class ReplaceInputStream extends BufferedInputStream { "An underlaying buffer is too small for these replace values"); } - if (spos >= slen) { + // We need at least one byte of data to process + if (available() < Math.max(maxFromSize, 1) && !eof) { spos = 0; slen = in.read(source); } - // Note: very simple, not efficient implementation, sorry. + // Note: very simple, not efficient implementation; sorry. int count = 0; while (spos < slen && count < len - maxToSize) { boolean replaced = false;