从assets中读取文件

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (21)
public class Utils {
    public static List<Message> getMessages() {
        //File file = new File("file:///android_asset/helloworld.txt");
        AssetManager assetManager = getAssets();
        InputStream ims = assetManager.open("helloworld.txt");    
     }
}

我正在使用这段代码试图从资产中读取一个文件。我试过两种方法。首先,使用时File我收到FileNotFoundException,使用时AssetManager getAssets()方法不被识别。这里有什么解决办法吗?

提问于
用户回答回答于

下面是我在一个缓冲阅读、扩展/修改活动中所做的工作,以满足需要

BufferedReader reader = null;
try {
    reader = new BufferedReader(
        new InputStreamReader(getAssets().open("filename.txt")));

    // do reading, usually loop until end of file reading  
    String mLine;
    while ((mLine = reader.readLine()) != null) {
       //process line
       ...
    }
} catch (IOException e) {
    //log the exception
} finally {
    if (reader != null) {
         try {
             reader.close();
         } catch (IOException e) {
             //log the exception
         }
    }
}

更新

要打开指定类型的文件,只需在InputStreamReader调用中添加类型,如下所示。

BufferedReader reader = null;
try {
    reader = new BufferedReader(
        new InputStreamReader(getAssets().open("filename.txt"), "UTF-8")); 

    // do reading, usually loop until end of file reading 
    String mLine;
    while ((mLine = reader.readLine()) != null) {
       //process line
       ...
    }
} catch (IOException e) {
    //log the exception
} finally {
    if (reader != null) {
         try {
             reader.close();
         } catch (IOException e) {
             //log the exception
         }
    }
}

编辑

正如@Stan在评论中所说,我给出的代码不是总结行。mLine每次通过都会被替换掉。所以我才写//process line。我假设该文件包含某种数据(即联系人列表),每一行都应该单独处理。

如果只是想在没有任何处理的情况下加载文件,则必须进行总结。mLine每次通过时StringBuilder()并附加每一个关口。

另一个编辑

添加了finally封锁。

还请注意,在Java 7和更高版本中,可以使用try-with-resources使用AutoCloseableCloseable最近Java的特性。

语境

在评论@LunarWatcher中指出getAssets()classcontext。所以,如果你把它称为activity需要引用它并将上下文实例传递给活动。

ContextInstance.getAssets();

这一点在@Maneesh的回答中得到了解释。所以如果这对你有用的话,那就投票给他的答案,因为那是他指出的。

用户回答回答于
getAssets()

只起作用在活动中在其他类中,必须使用Context为了它。

使出Utils构造函数类将活动引用(丑陋的方式)或应用程序的上下文作为参数传递给它。在Utils类中使用getAsset()。

扫码关注云+社区