23

我在资产文件夹中有一个文本文件,我需要将其转换为 File 对象(而不是 InputStream)。当我尝试这个时,我得到“没有这样的文件”异常:

String path = "file:///android_asset/datafile.txt";
URL url = new URL(path);
File file = new File(url.toURI());  // Get exception here

我可以修改它以使其正常工作吗?

顺便说一句,我有点尝试“通过示例编写代码”,查看我项目中其他地方的以下代码,它引用了 assets 文件夹中的 HTML 文件

public static Dialog doDialog(final Context context) {
WebView wv = new WebView(context);      
wv.loadUrl("file:///android_asset/help/index.html");

我承认我并不完全理解上述机制,所以我试图做的事情可能行不通。

谢谢!

4

3 回答 3

29

您不能File直接从资产中获取对象,因为资产未存储为文件。您需要将资产复制到文件中,然后File在副本中获取对象。

于 2012-05-01T19:00:49.827 回答
12

您不能直接从资产中获取 File 对象。

首先,使用例如AssetManager#open从您的资产中获取一个 inputStream

然后复制 inputStream :

    public static void writeBytesToFile(InputStream is, File file) throws IOException{
    FileOutputStream fos = null;
    try {   
        byte[] data = new byte[2048];
        int nbread = 0;
        fos = new FileOutputStream(file);
        while((nbread=is.read(data))>-1){
            fos.write(data,0,nbread);               
        }
    }
    catch (Exception ex) {
        logger.error("Exception",ex);
    }
    finally{
        if (fos!=null){
            fos.close();
        }
    }
}
于 2014-02-12T14:05:22.733 回答
-1

代码中缺少此功能。@wadali

private void copyFile(InputStream in, OutputStream out) throws IOException {
    byte[] buffer = new byte[1024];
    int read;
    while((read = in.read(buffer)) != -1){
      out.write(buffer, 0, read);
    }
}

来源:https ://stackoverflow.com/a/4530294/4933464

于 2016-11-06T17:00:24.150 回答