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()方法。这里有什么解决办法吗?
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
//process line
mLine如果您只是想在不进行任何处理的情况下加载文件,则必须在每次通过时使用StringBuilder()并附加每个通道进行总结。
StringBuilder()
另一个编辑
根据@Vincent 的评论,我添加了该finally块。
finally
另请注意,在 Java 7 及更高版本中,您可以使用最新 Javatry-with- resources的AutoCloseable和Closeable特性。
try-with- resources
AutoCloseable
Closeable
语境
@LunarWatcher 在评论中指出这getAssets()是一个classin context。因此,如果您在 an 之外调用它,则activity需要引用它并将上下文实例传递给活动。
getAssets()
class
context
activity
ContextInstance.getAssets();
这在@Maneesh 的回答中得到了解释。因此,如果这对您有用,请支持他的答案,因为那是他指出的。