Fix streamPos/bitPos issue in SubImageOutputStream.

This commit is contained in:
Harald Kuhr 2017-08-21 22:03:18 +02:00
parent 792b531b0e
commit 0170ee36a9

View File

@ -4,6 +4,8 @@ import javax.imageio.stream.ImageOutputStream;
import javax.imageio.stream.ImageOutputStreamImpl;
import java.io.IOException;
import static com.twelvemonkeys.lang.Validate.notNull;
/**
* ImageInputStream that writes through a delegate, but keeps local position and bit offset.
* Note: Flushing or closing this stream will *not* have an effect on the delegate.
@ -14,29 +16,47 @@ import java.io.IOException;
*/
public class SubImageOutputStream extends ImageOutputStreamImpl {
private final ImageOutputStream stream;
private final long startPos;
public SubImageOutputStream(final ImageOutputStream stream) {
this.stream = stream;
public SubImageOutputStream(final ImageOutputStream stream) throws IOException {
this.stream = notNull(stream, "stream");
startPos = stream.getStreamPosition();
}
@Override
public void seek(long pos) throws IOException {
super.seek(pos);
stream.seek(startPos + pos);
}
@Override
public void write(int b) throws IOException {
flushBits();
stream.write(b);
streamPos++;
}
@Override
public void write(byte[] b, int off, int len) throws IOException {
flushBits();
stream.write(b, off, len);
streamPos += len;
}
@Override
public int read() throws IOException {
bitOffset = 0;
streamPos++;
return stream.read();
}
@Override
public int read(byte[] b, int off, int len) throws IOException {
return stream.read(b, off, len);
bitOffset = 0;
int count = stream.read(b, off, len);
streamPos += count;
return count;
}
@Override