在androids assets文件夹中检查文件是否存在?

时间:2010-08-28 23:00:48

标签: android

我的应用在assets文件夹的子目录中有.txt文件。它读取那些.txt文件并将它们放在textview中。它运作良好,没有问题。

我是否应该关注资产文件夹中的文件被用户删除或丢失。如果发生这种情况,我的应用程序会收到错误,因为当它尝试将其读入流中时,该文件将不存在。

在我阅读资产文件之前是否需要检查资产文件的存在,或资产经理是否负责这一切?我也想知道用户是否有可能删除资产文件。

就像我说的,没有我插入代码来检查文件是否存在,一切正常。我只是想知道人们每次从资产中读取流时是否都使用.exists()语句。

6 个答案:

答案 0 :(得分:68)

您可能会担心该文件已被删除且apk已取消

您可以使用以下方式查看:

Arrays.asList(getResources().getAssets().list("")).contains("myFile")

答案 1 :(得分:25)

如果你真的想检查文件是否存在:

AssetManager mg = getResources().getAssets();
InputStream is = null;
try {
  is = mg.open(pathInAssets);
  //File exists so do something with it
} catch (IOException ex) {
  //file does not exist
} finally {
  if (is != null) {
    is.close();
  }
}

如果您的文件位于assets/folder/file.ext,则pathInAssets即可 "folder/file.ext"

答案 2 :(得分:6)

理想情况下,在构建apk之后,没有人可以从中删除任何资产,但如果有人反编译它并重新编译,那么就可能。

虽然对于其他情况,当运行时apk中没有资产时,我们可以检查资产是否存在。

在我们的应用程序中,我们有一个使用gradle,ant和eclipse构建应用程序的规定,并且对于每个构建机制,我们的一些资产文件捆绑在apk中,而有些则不捆绑,因此要确定是否存在任何资产文件当前构建apk在运行时,

我们这样做如下:

private boolean isAssetExists(String pathInAssetsDir){
    AssetManager assetManager = AppContext.get().getResources().getAssets();
    InputStream inputStream = null;
    try {
        inputStream = assetManager.open(pathInAssetsDir);
        if(null != inputStream ) {
           return true;
        }
    }  catch(IOException e) {
        e.printStackTrace();
    } finally {
        try {
            inputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }  
    return false;
}

答案 3 :(得分:4)

是和否。

普通用户无法删除它们,但是根电话上的用户不知道他们在做什么......这是另一种情况。

如果你问我,不需要额外的代码。此外,如果您尝试打开一个不存在的文件,您将在某个时刻抛出异常,捕获该异常,并在真正想要时显示一个对话框。

答案 4 :(得分:1)

我认为你应该没事。从我手机中的根目录开始,我看不到删除应用程序的任何方法而不删除应用程序,因为它似乎都包含在.apk文件中。你可以这样做,但我认为你需要扎根或使用adb。

无论如何,我会亲自围绕任何带有try / catch块的读/写,只是为了安全。

答案 5 :(得分:1)

AssetManager am = getAssets();

    try {
        List<String> mapList = Arrays.asList(am.list("path/in/assets/folder"));

        if (mapList.contains("file_to_check")) {
            Log.e("ERROR", "exists");
        } else {
            Log.e("ERROR", "not exists");
        }
    } catch ( IOException ex){
        ex.printStackTrace();
    }

转换为函数或方法很容易;)