小编典典

从资产中读取文件

all

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()方法。这里有什么解决办法吗?


阅读 132

收藏
2022-06-30

共1个答案

小编典典

这是我在缓冲阅读扩展/修改以满足您的需求的活动中所做的

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()并附加每个通道进行总结。

另一个编辑

根据@Vincent 的评论,我添加了该finally块。

另请注意,在 Java 7 及更高版本中,您可以使用最新 Javatry-with- resourcesAutoCloseableCloseable特性。

语境

@LunarWatcher 在评论中指出这getAssets()是一个classin context。因此,如果您在 an
之外调用它,则activity需要引用它并将上下文实例传递给活动。

ContextInstance.getAssets();

这在@Maneesh 的回答中得到了解释。因此,如果这对您有用,请支持他的答案,因为那是他指出的。

2022-06-30