blob: 3a780a16ec9fdc7436b64ceaa1a77205dec4783d [file] [log] [blame]
/*
* Copyright 2000-2013 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.intellij.util.io;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Arrays;
public class UnsyncByteArrayOutputStream extends OutputStream {
protected byte[] myBuffer;
protected int myCount;
private boolean myIsShared;
public UnsyncByteArrayOutputStream() {
this(32);
}
public UnsyncByteArrayOutputStream(int size) {
this(new byte[size]);
}
public UnsyncByteArrayOutputStream(byte[] buffer) {
myBuffer = buffer;
}
@Override
public void write(int b) {
int newcount = myCount + 1;
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;
}
@Override
public void write(byte b[], int off, int len) {
if ((off < 0) || (off > b.length) || (len < 0) ||
((off + len) > b.length) || ((off + len) < 0)) {
throw new IndexOutOfBoundsException();
} else if (len == 0) {
return;
}
int newcount = myCount + len;
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;
}
public void writeTo(OutputStream out) throws IOException {
out.write(myBuffer, 0, myCount);
}
public void reset() {
myCount = 0;
}
public byte[] toByteArray() {
if (myBuffer.length == myCount) {
myIsShared = true;
return myBuffer;
}
return Arrays.copyOf(myBuffer, myCount);
}
public int size() {
return myCount;
}
public String toString() {
return new String(myBuffer, 0, myCount);
}
}