我的应用在assets文件夹的子目录中有.txt文件。它读取那些.txt文件并将它们放在textview中。它运作良好,没有问题。
我是否应该关注资产文件夹中的文件被用户删除或丢失。如果发生这种情况,我的应用程序会收到错误,因为当它尝试将其读入流中时,该文件将不存在。
在我阅读资产文件之前是否需要检查资产文件的存在,或资产经理是否负责这一切?我也想知道用户是否有可能删除资产文件。
就像我说的,没有我插入代码来检查文件是否存在,一切正常。我只是想知道人们每次从资产中读取流时是否都使用.exists()语句。
答案 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();
}
转换为函数或方法很容易;)