aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAvik Sengupta <avik@apache.org>2003-03-18 18:58:43 +0000
committerAvik Sengupta <avik@apache.org>2003-03-18 18:58:43 +0000
commita50c693053f2dba42cfa9bbcca9f29dcb119d0c4 (patch)
tree6dee0f2b0a3c439f48b0613f231999f5d589cd48
parentec9a711557243faeede8dcb78c309b736a49285e (diff)
downloadpoi-a50c693053f2dba42cfa9bbcca9f29dcb119d0c4.tar.gz
poi-a50c693053f2dba42cfa9bbcca9f29dcb119d0c4.zip
Added new class per bug 13478, to read data from low performance input streams.
Patch submitted by Jens Gerhard - thanks. git-svn-id: https://svn.apache.org/repos/asf/jakarta/poi/trunk@353030 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r--src/java/org/apache/poi/util/BlockingInputStream.java100
1 files changed, 100 insertions, 0 deletions
diff --git a/src/java/org/apache/poi/util/BlockingInputStream.java b/src/java/org/apache/poi/util/BlockingInputStream.java
new file mode 100644
index 0000000000..1aac12172b
--- /dev/null
+++ b/src/java/org/apache/poi/util/BlockingInputStream.java
@@ -0,0 +1,100 @@
+package org.apache.poi.util;
+
+import java.io.InputStream;
+import java.io.IOException;
+
+/**
+ * Implementation of a BlockingInputStream to provide data to
+ * RawDataBlock that expects data in 512 byte chunks. Useful to read
+ * data from slow (ie, non FileInputStream) sources, for example when
+ * reading an OLE2 Document over a network.
+ *
+ * Possible extentions: add a timeout. Curently a call to read(byte[]) on this
+ * class is blocking, so use at your own peril if your underlying stream blocks.
+ *
+ * @author Jens Gerhard
+ * @author aviks - documentation cleanups.
+ */
+public class BlockingInputStream
+ extends InputStream
+{
+ protected InputStream is;
+
+ public BlockingInputStream(InputStream is)
+ {
+ this.is = is;
+ }
+
+ public int available()
+ throws IOException
+ {
+ return is.available();
+ }
+
+ public void close()
+ throws IOException
+ {
+ is.close();
+ }
+
+ public void mark(int readLimit)
+ {
+ is.mark(readLimit);
+ }
+
+ public boolean markSupported()
+ {
+ return is.markSupported();
+ }
+
+ public int read()
+ throws IOException
+ {
+ return is.read();
+ }
+
+ /**
+ * We had to revert to byte per byte reading to keep
+ * with slow network connections on one hand, without
+ * missing the end-of-file.
+ * This is the only method that does its own thing in this class
+ * everything else is delegated to aggregated stream.
+ * THIS IS A BLOCKING BLOCK READ!!!
+ */
+ public int read(byte[] bf)
+ throws IOException
+ {
+
+ int i = 0;
+ int b = 4611;
+ while ( i < bf.length )
+ {
+ b = is.read();
+ if ( b == -1 )
+ break;
+ bf[i++] = (byte) b;
+ }
+ if ( i == 0 && b == -1 )
+ return -1;
+ return i;
+ }
+
+ public int read(byte[] bf, int s, int l)
+ throws IOException
+ {
+ return is.read(bf, s, l);
+ }
+
+ public void reset()
+ throws IOException
+ {
+ is.reset();
+ }
+
+ public long skip(long n)
+ throws IOException
+ {
+ return is.skip(n);
+ }
+}
+