X-Git-Url: http://git.nikiroo.be/?a=blobdiff_plain;f=src%2Fbe%2Fnikiroo%2Futils%2Fstreams%2FBufferedInputStream.java;h=683fa55865aff5ee4b6d442638721372c99e0e02;hb=505be508ae7d3fb48122be548b310a238cfb91eb;hp=397f6fcf9b22f414631cddb899ab38a3b38f3fa1;hpb=f04d5e49e91832e122617fbbaa5cdb053459a7e7;p=fanfix.git diff --git a/src/be/nikiroo/utils/streams/BufferedInputStream.java b/src/be/nikiroo/utils/streams/BufferedInputStream.java index 397f6fc..683fa55 100644 --- a/src/be/nikiroo/utils/streams/BufferedInputStream.java +++ b/src/be/nikiroo/utils/streams/BufferedInputStream.java @@ -4,6 +4,8 @@ import java.io.IOException; import java.io.InputStream; import java.util.Arrays; +import be.nikiroo.utils.StringUtils; + /** * A simple {@link InputStream} that is buffered with a bytes array. *

@@ -14,13 +16,22 @@ import java.util.Arrays; * @author niki */ public class BufferedInputStream extends InputStream { + /** + * The size of the internal buffer (can be different if you pass your own + * buffer, of course). + *

+ * A second buffer of twice the size can sometimes be created as needed for + * the {@link BufferedInputStream#startsWith(byte[])} search operation. + */ + static private final int BUFFER_SIZE = 4096; + /** The current position in the buffer. */ protected int start; /** The index of the last usable position of the buffer. */ protected int stop; /** The buffer itself. */ protected byte[] buffer; - /** An End-Of-File (or buffer, here) marker. */ + /** An End-Of-File (or {@link InputStream}, here) marker. */ protected boolean eof; private boolean closed; @@ -45,7 +56,7 @@ public class BufferedInputStream extends InputStream { public BufferedInputStream(InputStream in) { this.in = in; - this.buffer = new byte[4096]; + this.buffer = new byte[BUFFER_SIZE]; this.originalBuffer = this.buffer; this.start = 0; this.stop = 0; @@ -94,6 +105,15 @@ public class BufferedInputStream extends InputStream { this.stop = length; } + /** + * The internal buffer size (can be useful to know for search methods). + * + * @return the size of the internal buffer, in bytes. + */ + public int getInternalBufferSize() { + return originalBuffer.length; + } + /** * Return this very same {@link BufferedInputStream}, but keep a counter of * how many streams were open this way. When calling @@ -116,6 +136,50 @@ public class BufferedInputStream extends InputStream { return this; } + /** + * Check if the current content (until eof) is equal to the given search + * term. + *

+ * Note: the search term size must be smaller or equal the internal + * buffer size. + * + * @param search + * the term to search for + * + * @return TRUE if the content that will be read starts with it + * + * @throws IOException + * in case of I/O error or if the size of the search term is + * greater than the internal buffer + */ + public boolean is(String search) throws IOException { + return is(StringUtils.getBytes(search)); + } + + /** + * Check if the current content (until eof) is equal to the given search + * term. + *

+ * Note: the search term size must be smaller or equal the internal + * buffer size. + * + * @param search + * the term to search for + * + * @return TRUE if the content that will be read starts with it + * + * @throws IOException + * in case of I/O error or if the size of the search term is + * greater than the internal buffer + */ + public boolean is(byte[] search) throws IOException { + if (startsWith(search)) { + return (stop - start) == search.length; + } + + return false; + } + /** * Check if the current content (what will be read next) starts with the * given search term. @@ -132,14 +196,17 @@ public class BufferedInputStream extends InputStream { * in case of I/O error or if the size of the search term is * greater than the internal buffer */ - public boolean startsWiths(String search) throws IOException { - return startsWith(search.getBytes("UTF-8")); + public boolean startsWith(String search) throws IOException { + return startsWith(StringUtils.getBytes(search)); } /** * Check if the current content (what will be read next) starts with the * given search term. *

+ * An empty string will always return true (unless the stream is closed, + * which would throw an {@link IOException}). + *

* Note: the search term size must be smaller or equal the internal * buffer size. * @@ -168,7 +235,7 @@ public class BufferedInputStream extends InputStream { if (available() >= search.length) { // Easy path return StreamUtils.startsWith(search, buffer, start, stop); - } else if (!eof) { + } else if (in != null && !eof) { // Harder path if (buffer2 == null && buffer.length == originalBuffer.length) { buffer2 = Arrays.copyOf(buffer, buffer.length * 2); @@ -199,7 +266,7 @@ public class BufferedInputStream extends InputStream { } /** - * Check if this stream is totally spent (no more data to read or to + * Check if this stream is spent (no more data to read or to * process). * * @return TRUE if it is @@ -216,6 +283,24 @@ public class BufferedInputStream extends InputStream { return !hasMoreData(); } + /** + * Read the whole {@link InputStream} until the end and return the number of + * bytes read. + * + * @return the number of bytes read + * + * @throws IOException + * in case of I/O error + */ + public long end() throws IOException { + long skipped = 0; + while (hasMoreData()) { + skipped += skip(buffer.length); + } + + return skipped; + } + @Override public int read() throws IOException { checkClose();