Как проверить ресурс Android Asset?

Я хочу проверить, существует ли файл в папке /assets/. Как я мог это сделать? Пожалуйста помоги.


person Mudassir    schedule 11.11.2010    source источник


Ответы (4)


Вы должны выполнить свои собственные проверки. Насколько я знаю, для этой работы нет метода.

person Chromium    schedule 13.12.2010
comment
Понятно, что для этого может не быть метода, но если вы не можете предоставить альтернативу, то это не должно было быть ответом. - person Gowiem; 06.06.2012

Я добавил вспомогательный метод в один из моих классов приложений. Я предполагаю, что;

  1. список активов не меняется во время работы приложения.
  2. List<String> не пожирает память (всего 78 ресурсов в моем приложении).
  3. проверка exists() в списке быстрее, чем попытка открыть файл и обработать исключение (на самом деле я не профилировал это).
AssetManager am;
List<String> mapList;

/**
 * Checks if an asset exists.
 *
 * @param assetName
 * @return boolean - true if there is an asset with that name.
 */
public boolean checkIfInAssets(String assetName) {
    if (mapList == null) {
        am = getAssets();
        try {
            mapList = Arrays.asList(am.list(""));
        } catch (IOException e) {
        }
    }
    return mapList.contains(assetName);
}
person geoffc    schedule 14.08.2011
comment
List.contains() уже возвращает логическое значение, нет необходимости в троичном выражении в конце функции. - person Vytautas Šaltenis; 11.08.2012

Вы также можете просто попытаться открыть поток, если он не работает, файла нет, и если он не терпит неудачу, файл должен быть там:

/**
 * Check if an asset exists. This will fail if the asset has a size < 1 byte.
 * @param context
 * @param path
 * @return TRUE if the asset exists and FALSE otherwise
 */
public static boolean assetExists(Context context, String path) {
    boolean bAssetOk = false;
    try {
        InputStream stream = context.getAssets().open(ASSET_BASE_PATH + path);
        stream.close();
        bAssetOk = true;
    } catch (FileNotFoundException e) {
        Log.w("IOUtilities", "assetExists failed: "+e.toString());
    } catch (IOException e) {
        Log.w("IOUtilities", "assetExists failed: "+e.toString());
    }
    return bAssetOk;
}
person Moss    schedule 09.11.2011
comment
Это решение намного быстрее, чем получение всей папки актива в виде списка и проверка содержания. (Я измерил ~ 50 мс против ~ 800 мс на моем устройстве) - person azendh; 01.08.2014

Вы можете использовать Resources.openRawResourceFd(int resId)

http://developer.android.com/reference/android/content/res/Resources.html#openRawResourceFd%28int%29

person Hrk    schedule 11.11.2010
comment
Это не дает никакого способа проверить существование файла. Спасибо, в любом случае. - person Mudassir; 11.11.2010
comment
Если файл не существует, будет выдано исключение NotFoundException. Вы можете поймать его и делать то, что вы хотите. - person Hrk; 11.11.2010