private boolean closed;
private int openCounter;
+ private byte[] b1;
/**
* Create a new {@link BufferedInputStream} that wraps the given
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
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
*/
flush(false);
out.write(source, sourceOffset, sourceLength);
+ bytesWritten += (sourceLength - sourceOffset);
return;
}
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;
openCounter--;
} else {
closed = true;
- flush(true);
+ flush(includingSubStream);
if (includingSubStream && out != null) {
out.close();
}
package be.nikiroo.utils.test_code;
import java.io.ByteArrayOutputStream;
+import java.util.ArrayList;
+import java.util.List;
import be.nikiroo.utils.streams.BufferedOutputStream;
import be.nikiroo.utils.test.TestCase;
}
});
+ addTest(new TestCase("Single write of 5000 bytes") {
+ @Override
+ public void test() throws Exception {
+ ByteArrayOutputStream bout = new ByteArrayOutputStream();
+ BufferedOutputStream out = new BufferedOutputStream(bout);
+
+ byte[] data = new byte[5000];
+ for (int i = 0; i < data.length; i++) {
+ data[i] = (byte) (i % 255);
+ }
+
+ out.write(data);
+ out.close();
+
+ checkArrays(this, "FIRST", bout, data);
+ }
+ });
+
addTest(new TestCase("Multiple writes") {
@Override
public void test() throws Exception {
checkArrays(this, "FIRST", bout, dataAll);
}
});
+
+ addTest(new TestCase("Multiple writes for a 5000 bytes total") {
+ @Override
+ public void test() throws Exception {
+ ByteArrayOutputStream bout = new ByteArrayOutputStream();
+ BufferedOutputStream out = new BufferedOutputStream(bout);
+
+ byte[] data = new byte[] { 42, 12, 0, 127, 51, 2, 32, 66, 7, 87 };
+
+ List<Byte> bytes = new ArrayList<Byte>();
+
+ // write 400 * 10 + 1000 bytes = 5000
+ for (int i = 0; i < 400; i++) {
+ for (int j = 0; j < data.length; j++) {
+ bytes.add(data[j]);
+ }
+ out.write(data);
+ }
+
+ for (int i = 0; i < 1000; i++) {
+ for (int j = 0; j < data.length; j++) {
+ bytes.add(data[j]);
+ }
+ out.write(data);
+ }
+
+ out.close();
+
+ byte[] abytes = new byte[bytes.size()];
+ for (int i = 0; i < bytes.size(); i++) {
+ abytes[i] = bytes.get(i);
+ }
+
+ checkArrays(this, "FIRST", bout, abytes);
+ }
+ });
}
static void checkArrays(TestCase test, String prefix,