file.exists()在Android上返回false

时间:2012-11-13 16:39:07

标签: android

    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之前检查文件是否存在?

3 个答案:

答案 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()作为帮助程序