docs: protected void init() throws IOException {
  		if (internalIn2 != null)
  			return;
  
  		Charset preciseCharset;
  		byte bom[] = new byte[BOM_SIZE];
  		int n, unread;
  		n = internalIn.read(bom, 0, bom.length);
  
  		if ((bom[0] == (byte) 0x00) && (bom[1] == (byte) 0x00) && (bom[2] == (byte) 0xFE) && (bom[3] == (byte) 0xFF)) {
  			preciseCharset = Charset.forName("UTF-32BE");
  			unread = n - 4;
  		} else if ((bom[0] == (byte) 0xFF) && (bom[1] == (byte) 0xFE) && (bom[2] == (byte) 0x00) && (bom[3] == (byte) 0x00)) {
  			preciseCharset = Charset.forName("UTF-32LE");
  			unread = n - 4;
  		} else if ((bom[0] == (byte) 0xEF) && (bom[1] == (byte) 0xBB) && (bom[2] == (byte) 0xBF)) {
  			preciseCharset = Charset.forName("UTF-8");
  			unread = n - 3;
  		} else if ((bom[0] == (byte) 0xFE) && (bom[1] == (byte) 0xFF)) {
  			preciseCharset = Charset.forName("UTF-16BE");
  			unread = n - 2;
  		} else if ((bom[0] == (byte) 0xFF) && (bom[1] == (byte) 0xFE)) {
  			preciseCharset = Charset.forName("UTF-16LE");
  			unread = n - 2;
  		} else {
  			// Unicode BOM mark not found, unread all bytes
  			preciseCharset = charset;
  			unread = n;
  		}
  		if (unread > 0)
  			internalIn.unread(bom, (n - unread), unread);
  
  		// Use given encoding
  		internalIn2 = preciseCharset == null ? new InputStreamReader(internalIn) : new InputStreamReader(internalIn, preciseCharset);
  	}