if (encoding == null || encoding.toLowerCase().indexOf("utf") != -1) {
byte bom[] = new byte[4];
int unread;
// auto-detect byte-order-mark
@SuppressWarnings("resource")
PushbackInputStream pushbackInputStream = new PushbackInputStream(inputStream, bom.length);
int n = pushbackInputStream.read(bom, 0, bom.length);
// Read ahead four bytes and check for BOM marks.
if ((bom[0] == (byte) 0xEF) && (bom[1] == (byte) 0xBB) && (bom[2] == (byte) 0xBF)) {
encoding = "UTF-8";
unread = n - 3;
} else if ((bom[0] == (byte) 0xFE) && (bom[1] == (byte) 0xFF)) {
encoding = "UTF-16BE";
unread = n - 2;
} else if ((bom[0] == (byte) 0xFF) && (bom[1] == (byte) 0xFE)) {
encoding = "UTF-16LE";
unread = n - 2;
} else if ((bom[0] == (byte) 0x00) && (bom[1] == (byte) 0x00) && (bom[2] == (byte) 0xFE)
&& (bom[3] == (byte) 0xFF)) {
encoding = "UTF-32BE";
unread = n - 4;
} else if ((bom[0] == (byte) 0xFF) && (bom[1] == (byte) 0xFE) && (bom[2] == (byte) 0x00)
&& (bom[3] == (byte) 0x00)) {
encoding = "UTF-32LE";
unread = n - 4;
} else {
unread = n;
}
if (unread > 0) {
pushbackInputStream.unread(bom, (n - unread), unread);
} else if (unread < -1) {
pushbackInputStream.unread(bom, 0, 0);
}
inputStream = pushbackInputStream;
}