From b426acc268453ddd342921c53f2e48faac8a0b8f Mon Sep 17 00:00:00 2001 From: Andreas Fankhauser hiddenalpha.ch Date: Fri, 30 Dec 2022 01:05:20 +0100 Subject: Add ByteCountOutputStream and ByteCountInputStream --- .../xtra4j/octetstream/ByteCountInputStream.java | 67 ++++++++++++++++++++++ .../xtra4j/octetstream/ByteCountOutputStream.java | 40 +++++++++++++ 2 files changed, 107 insertions(+) create mode 100644 xtra4j-misc/src/main/java/ch/hiddenalpha/xtra4j/octetstream/ByteCountInputStream.java create mode 100644 xtra4j-misc/src/main/java/ch/hiddenalpha/xtra4j/octetstream/ByteCountOutputStream.java diff --git a/xtra4j-misc/src/main/java/ch/hiddenalpha/xtra4j/octetstream/ByteCountInputStream.java b/xtra4j-misc/src/main/java/ch/hiddenalpha/xtra4j/octetstream/ByteCountInputStream.java new file mode 100644 index 0000000..25da757 --- /dev/null +++ b/xtra4j-misc/src/main/java/ch/hiddenalpha/xtra4j/octetstream/ByteCountInputStream.java @@ -0,0 +1,67 @@ +package ch.hiddenalpha.xtra4j.octetstream; + +import java.io.IOException; +import java.io.InputStream; + + +/** + * {@link InputStream} decorator to count bytes flowed through the stream. + * + */ +public class ByteCountInputStream extends InputStream { + + // TODO: mark/reset should be simple to implement. + + private final InputStream origin; + private long numBytes = 0; + + public ByteCountInputStream( InputStream origin ){ + this.origin = origin; + } + + /** @return How many bytes had flown through this stream. */ + public long getByteCount() { return numBytes; } + + @Override + public int read() throws IOException { + int b = origin.read(); + if( b >= 0 ){ + numBytes += 1; } + return b; + } + + @Override + public int read( byte[] b, int off, int len ) throws IOException { + int readLen = origin.read(b, off, len); + if( readLen > 0 ){ + numBytes += readLen; } + return readLen; + } + + @Override + public int available() throws IOException { + return origin.available(); + } + + @Override + public void close() throws IOException { + origin.close(); + } + + //@Override + //public synchronized void mark( int readlimit ) { + // origin.mark(readlimit); + //} + + //@Override + //public synchronized void reset() throws IOException { + // origin.reset(); + //} + + @Override + public boolean markSupported() { + return false; + //return origin.markSupported(); + } + +} diff --git a/xtra4j-misc/src/main/java/ch/hiddenalpha/xtra4j/octetstream/ByteCountOutputStream.java b/xtra4j-misc/src/main/java/ch/hiddenalpha/xtra4j/octetstream/ByteCountOutputStream.java new file mode 100644 index 0000000..1cb9d0d --- /dev/null +++ b/xtra4j-misc/src/main/java/ch/hiddenalpha/xtra4j/octetstream/ByteCountOutputStream.java @@ -0,0 +1,40 @@ +package ch.hiddenalpha.xtra4j.octetstream; + +import java.io.IOException; +import java.io.OutputStream; + + +/** + * {@link OutputStream} decorator to count bytes flowed through the stream. + */ +public class ByteCountOutputStream extends OutputStream { + + private final OutputStream origin; + private long numBytes = 0; + + public ByteCountOutputStream( OutputStream origin ){ + this.origin = origin; + } + + /** @return How many bytes did pass that stream up to now. */ + public long getByteCount() { return numBytes; } + + @Override + public void write( int b ) throws IOException { + numBytes += 1; + origin.write(b); + } + + @Override + public void write( byte[] b, int off, int len ) throws IOException { + numBytes += len; + origin.write(b, off, len); + } + + @Override + public void flush() throws IOException { origin.flush(); } + + @Override + public void close() throws IOException { origin.close(); } + +} -- cgit v1.1