package tim.prune.save.xml;
import java.nio.charset.Charset;
/**
* Class to collect the bytes from an input stream
* and turn them into a String
*/
public class ByteBuffer
{
// Array of bytes
private byte[] _bytes = new byte[1024];
// Current position to append
private int _currPos = 0;
// Flag for recognising utf8 encoded streams
private boolean _streamUtf8 = false;
// Flag for whether system is utf8 or not
private final boolean _systemUtf8 = XmlUtils.isSystemUtf8();
/**
* Append the given byte to the buffer
* @param inB byte to append
*/
public void appendByte(byte inB)
{
// Resize array if necessary
if (_currPos >= _bytes.length)
{
byte[] bigger = new byte[_bytes.length * 2];
System.arraycopy(_bytes, 0, bigger, 0, _bytes.length);
_bytes = bigger;
}
// Append byte and increment counter
_bytes[_currPos] = inB;
_currPos++;
}
/**
* Clear the buffer and reset
*/
public void clear()
{
_currPos = 0;
// Reduce size back to default if it's got too big
if (_bytes.length > 5000) {
_bytes = new byte[1024];
}
}
/**
* Set the flag that this stream is encoded with utf8
*/
public void setEncodingUtf8() {
_streamUtf8 = true;
}
/**
* @return contents of buffer as a String
*/
public String toString()
{
// Sometimes the encoding of the read file isn't the default encoding of the system
if (_streamUtf8 && !_systemUtf8)
{
return new String(_bytes, 0, _currPos, Charset.forName("UTF-8"));
}
// Otherwise just use system encoding
return new String(_bytes, 0, _currPos);
}
/**
* Look for the given character sequence in the last characters read
* @param inChars sequence to look for
* @return true if sequence found
*/
public boolean foundSequence(char[] inChars)
{
final int numChars = inChars.length;
if (_currPos < numChars) {return false;}
for (int i=0; i<numChars; i++)
{
char searchChar = inChars[numChars - 1 - i];
char sourceChar = (char) _bytes[_currPos - 1 - i];
if (searchChar != sourceChar) {return false;}
}
return true;
}
}