private static int determineType(byte[] bytes){
  int offset=0;
  if (bytes.length >= 3 && (bytes[0] & 0xFF) == 0xEF && (bytes[1] & 0xFF) == 0xBB && (bytes[2] & 0xFF) == 0xBF) {
    offset+=3;
  }
  while (offset < bytes.length && bytes[offset] == ' ' || bytes[offset] == '\t' || bytes[offset] == '\r' || bytes[offset] == '\n' || bytes[offset] == '\f') {
    offset++;
  }
  return determineType(new String(bytes,offset,Math.min(8,bytes.length - offset)));
}

private static int determineType ( byte [ ] bytes ) { int offset = 0 ; if ( bytes . length >= 3 && ( bytes [ 0 ] & 0xFF ) == 0xEF && ( bytes [ 1 ] & 0xFF ) == 0xBB && ( bytes [ 2 ] & 0xFF ) == 0xBF ) { offset += 3 ; } while ( offset < bytes . length && bytes [ offset ] == ' ' || bytes [ offset ] == '\t' || bytes [ offset ] == '\r' || bytes [ offset ] == '\n' || bytes [ offset ] == '\f' ) { offset ++ ; } return determineType ( new String ( bytes , offset , Math . min ( 8 , bytes . length - offset ) ) ) ; }
determines the type of a property list by means of the first bytes of its data
