set shared flag when toByteArray is called and if it is set then copy byte buffer on write

This commit is contained in:
Maxim.Mossienko
2014-02-05 18:58:50 +01:00
parent 0922b728f5
commit 4c780db3b7
@@ -24,6 +24,7 @@ import java.util.Arrays;
public class UnsyncByteArrayOutputStream extends OutputStream {
protected byte[] myBuffer;
protected int myCount;
private boolean myIsShared;
public UnsyncByteArrayOutputStream() {
this(32);
@@ -36,8 +37,9 @@ public class UnsyncByteArrayOutputStream extends OutputStream {
@Override
public void write(int b) {
int newcount = myCount + 1;
if (newcount > myBuffer.length) {
myBuffer = Arrays.copyOf(myBuffer, Math.max(myBuffer.length << 1, newcount));
if (newcount > myBuffer.length || myIsShared) {
myBuffer = Arrays.copyOf(myBuffer, newcount > myBuffer.length ? Math.max(myBuffer.length << 1, newcount):myBuffer.length);
myIsShared = false;
}
myBuffer[myCount] = (byte)b;
myCount = newcount;
@@ -52,8 +54,9 @@ public class UnsyncByteArrayOutputStream extends OutputStream {
return;
}
int newcount = myCount + len;
if (newcount > myBuffer.length) {
myBuffer = Arrays.copyOf(myBuffer, Math.max(myBuffer.length << 1, newcount));
if (newcount > myBuffer.length || myIsShared) {
myBuffer = Arrays.copyOf(myBuffer, newcount > myBuffer.length ? Math.max(myBuffer.length << 1, newcount): myBuffer.length);
myIsShared = false;
}
System.arraycopy(b, off, myBuffer, myCount, len);
myCount = newcount;
@@ -69,9 +72,8 @@ public class UnsyncByteArrayOutputStream extends OutputStream {
public byte[] toByteArray() {
if (myBuffer.length == myCount) {
byte[] buffer = myBuffer;
myBuffer = ArrayUtil.EMPTY_BYTE_ARRAY;
return buffer;
myIsShared = true;
return myBuffer;
}
return Arrays.copyOf(myBuffer, myCount);
}