docs: protected void init() throws IOException {
  		if (isInited) {
  			return;
  		}
  
  		byte bom[] = new byte[BOM_SIZE];
  		int n, unread;
  		n = in.read(bom, 0, bom.length);
  
  		if ((bom[0] == (byte) 0x00) && (bom[1] == (byte) 0x00) && (bom[2] == (byte) 0xFE) && (bom[3] == (byte) 0xFF)) {
  			charset = "UTF-32BE";
  			unread = n - 4;
  		} else if ((bom[0] == (byte) 0xFF) && (bom[1] == (byte) 0xFE) && (bom[2] == (byte) 0x00) && (bom[3] == (byte) 0x00)) {
  			charset = "UTF-32LE";
  			unread = n - 4;
  		} else if ((bom[0] == (byte) 0xEF) && (bom[1] == (byte) 0xBB) && (bom[2] == (byte) 0xBF)) {
  			charset = "UTF-8";
  			unread = n - 3;
  		} else if ((bom[0] == (byte) 0xFE) && (bom[1] == (byte) 0xFF)) {
  			charset = "UTF-16BE";
  			unread = n - 2;
  		} else if ((bom[0] == (byte) 0xFF) && (bom[1] == (byte) 0xFE)) {
  			charset = "UTF-16LE";
  			unread = n - 2;
  		} else {
  			// Unicode BOM mark not found, unread all bytes
  			charset = defaultCharset;
  			unread = n;
  		}
  		// System.out.println("read=" + n + ", unread=" + unread);
  
  		if (unread > 0) {
  			in.unread(bom, (n - unread), unread);
  		}
  
  		isInited = true;
  	}