protected void init(InputStream in,String defaultEncoding) throws IOException {
  PushbackInputStream tempIn=new PushbackInputStream(in,BOM_SIZE);
  byte bom[]=new byte[BOM_SIZE];
  int n, unread;
  n=tempIn.read(bom,0,bom.length);
  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 (n == BOM_SIZE && (bom[0] == (byte)0xFF) && (bom[1] == (byte)0xFE) && (bom[2] == (byte)0x00) && (bom[3] == (byte)0x00)) {
    encoding="UTF-32LE";
    unread=n - 4;
  }
 else   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 {
    encoding=defaultEncoding;
    unread=n;
  }
  if (unread > 0)   tempIn.unread(bom,(n - unread),unread);
 else   if (unread < -1)   tempIn.unread(bom,0,0);
  if (encoding == null) {
    internalIn=new InputStreamReader(tempIn);
    encoding=internalIn.getEncoding();
  }
 else {
    internalIn=new InputStreamReader(tempIn,encoding);
  }
}

protected void init ( InputStream in , String defaultEncoding ) throws IOException { PushbackInputStream tempIn = new PushbackInputStream ( in , BOM_SIZE ) ; byte bom [ ] = new byte [ BOM_SIZE ] ; int n , unread ; n = tempIn . read ( bom , 0 , bom . length ) ; 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 ( n == BOM_SIZE && ( bom [ 0 ] == ( byte ) 0xFF ) && ( bom [ 1 ] == ( byte ) 0xFE ) && ( bom [ 2 ] == ( byte ) 0x00 ) && ( bom [ 3 ] == ( byte ) 0x00 ) ) { encoding = "UTF-32LE" ; unread = n - 4 ; } else 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 { encoding = defaultEncoding ; unread = n ; } if ( unread > 0 ) tempIn . unread ( bom , ( n - unread ) , unread ) ; else if ( unread < - 1 ) tempIn . unread ( bom , 0 , 0 ) ; if ( encoding == null ) { internalIn = new InputStreamReader ( tempIn ) ; encoding = internalIn . getEncoding ( ) ; } else { internalIn = new InputStreamReader ( tempIn , encoding ) ; } }
read - ahead four bytes and check for bom marks . extra bytes are unread back to the stream , only bom bytes are skipped .
