X-Git-Url: http://git.nikiroo.be/?a=blobdiff_plain;ds=sidebyside;f=src%2Fbe%2Fnikiroo%2Futils%2Fstreams%2FBufferedOutputStream.java;h=14425345c179196d8944d3c391b60393c28db9d5;hb=2e465ed3dc72efcdf96e419b39d6119c0cc41c6c;hp=8b74ae162d2b58bf90040650bf7d02312134fece;hpb=c8ce09c4dc57142f94afcdc290dd79c4bddf7820;p=nikiroo-utils.git diff --git a/src/be/nikiroo/utils/streams/BufferedOutputStream.java b/src/be/nikiroo/utils/streams/BufferedOutputStream.java index 8b74ae1..1442534 100644 --- a/src/be/nikiroo/utils/streams/BufferedOutputStream.java +++ b/src/be/nikiroo/utils/streams/BufferedOutputStream.java @@ -37,6 +37,7 @@ public class BufferedOutputStream extends OutputStream { private boolean closed; private int openCounter; + private byte[] b1; /** * Create a new {@link BufferedInputStream} that wraps the given @@ -49,19 +50,15 @@ public class BufferedOutputStream extends OutputStream { this.out = out; this.buffer = new byte[4096]; + this.b1 = new byte[1]; this.start = 0; this.stop = 0; } @Override public void write(int b) throws IOException { - checkClose(); - - if (available() <= 0) { - flush(false); - } - - buffer[start++] = (byte) b; + b1[0] = (byte) b; + write(b1, 0, 1); } @Override @@ -86,7 +83,7 @@ public class BufferedOutputStream extends OutputStream { return; } - if (sourceLength >= buffer.length) { + if (bypassFlush && sourceLength >= buffer.length) { /* * If the request length exceeds the size of the output buffer, * flush the output buffer and then write the data directly. In this @@ -94,6 +91,7 @@ public class BufferedOutputStream extends OutputStream { */ flush(false); out.write(source, sourceOffset, sourceLength); + bytesWritten += (sourceLength - sourceOffset); return; } @@ -103,7 +101,7 @@ public class BufferedOutputStream extends OutputStream { flush(false); } - int now = Math.min(sourceLength, available()); + int now = Math.min(sourceLength - done, available()); System.arraycopy(source, sourceOffset + done, buffer, stop, now); stop += now; done += now; @@ -179,15 +177,22 @@ public class BufferedOutputStream extends OutputStream { *
* If {@link BufferedOutputStream#bypassFlush} is false, all writes to the * under-laying stream are done in this method. + *
+ * This can be used if you want to write some data in the under-laying + * stream yourself (in that case, flush this {@link BufferedOutputStream} + * with or without flushing the under-laying stream, then you can write to + * the under-laying stream). * * @param includingSubStream * also flush the under-laying stream * @throws IOException * in case of I/O error */ - protected void flush(boolean includingSubStream) throws IOException { - out.write(buffer, start, stop - start); - bytesWritten += (stop - start); + public void flush(boolean includingSubStream) throws IOException { + if (stop > start) { + out.write(buffer, start, stop - start); + bytesWritten += (stop - start); + } start = 0; stop = 0; @@ -245,7 +250,7 @@ public class BufferedOutputStream extends OutputStream { openCounter--; } else { closed = true; - flush(true); + flush(includingSubStream); if (includingSubStream && out != null) { out.close(); }