String filename = "file:///android_asset/Help_ja.html";
File f = new File(filename);
if (!f.exists()) filename="file:///android_asset/Help_us.html";
webView.loadUrl(filename);
我从assests文件夹中加载了一个HTML,两个文件都在那里,当我尝试这段代码时:
filename="file:///android_asset/Help_us.html";
webView.loadUrl(filename);
它有效,但由于某种原因,f.exists()返回false,我想也许是因为一个URL,但那我如何在将它加载到webView之前检查文件是否存在?
答案 0 :(得分:3)
在代码中,一个适合我的解决方案:
private static boolean assetExists(AssetManager assets, String name) {
try {
// using File to extract path / filename
// alternatively use name.lastIndexOf("/") to extract the path
File f = new File(name);
String parent = f.getParent();
if (parent == null) parent = "";
String fileName = f.getName();
// now use path to list all files
String[] assetList = assets.list(parent);
if (assetList != null && assetList.length > 0) {
for (String item : assetList) {
if (fileName.equals(item))
return true;
}
}
} catch (IOException e) {
// Log.w(TAG, e); // enable to log errors
}
return false;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// test for file:///android_asset/Help_ja.html
boolean exists1 = assetExists(getAssets(), "Help_ja.html"));
// and if assets are in subfolders
// would be ./assets/www/test2.hml in your project
boolean exists2 = assetExists(getAssets(), "www/test2.html");
}
资产文件不是设备上的物理文件,因此您无法使用File
。阅读其内容的唯一方法是通过AssetManager
。上面的示例代码使用list()
方法列出资产文件,并检查您搜索的文件列表。您也可以尝试打开InputStream
例如。
答案 1 :(得分:3)
假设您有两个文件路径:
String originalPath = "file:///android_asset/..."
String localizedPath = "file:///android_asset/..."
以下将测试是否存在第二个,如果不可用则默认为第一个:
String localizedAssetPath = localizedPath.replace("file:///android_asset/", "");
try {
InputStream stream = getResources().getAssets().open(localizedAssetPath);
stream.close();
return localizedPath;
}
catch (Exception e) {
return originalPath;
}
因此,基本上,您删除了file:///android_asset/
基本路径,并尝试将其作为流打开。如果失败,则默认为原始路径。
答案 2 :(得分:0)
文件不带URL,需要路径。所以它不应该以File:///开头,它应该以/开头为绝对路径或相对路径的第一个目录名。
如果在将其加载到URL之前需要检查它是否存在,请在传递给File构造函数之前从字符串中剥离协议。如果将URL加载到URL对象中,则可以使用getPath()和getFile()作为帮助程序