
一 前言
最近自己写一个程序,需要把文本文件里面的一些数据在程序第一次启动的时候初始化到数据库中去。所以就涉及到了读取文件的 *** 作。在我们android项目里面,有个assets文件夹,就是用来存储资源文件的,可以通过AssetManager访问。本来以为这是一件三只手指抓田螺--十拿九稳的事情,结果还是花了自己一个小时来调试它,就是读取文件出现了乱码。出现这种东西 "��1��0��0��0��1��",有些问号在里面。。
二 解决办法
后来在网上找了些资料看了下,说是要把文本文件保存成UTF-8类型才可以。试了下,果然ok下面分享下自己这块功能的代码
三 代码
1 文本文件内容格式:
复制内容到剪贴板
代码:
13076-5 2 0 9 5 0 1
13075-9 5 6 8 4 3 3
13074-2 0 4 0 2 8 8
13073-8 8 6 6 0 7 8
13072-2 0 8 8 6 3 5
大概就是这种格式,我需要对它们每行都进行解析,比如第一行解析成 13076 5 2 0 9 5 0 1 ,也就是8个数字,然后存入数据库里面分别对应的8列
2 主要代码
这里的话,自己新建了一个MyDbOpenHelper,然后重写了onCreate方法,这个方法会在我们第一次调用dbgetReadDatabase()或者getWriteDataBase()方法时调用,而且只会调用一次。就是程序第一次启动的时候。
ok在onCreate方法里面,主要代码的功能已经注释,大家可以自己看。。private static class MyDbOpenHelper extends SQLiteOpenHelper{
private Context c;
public MyDbOpenHelper(Context context, String name,
CursorFactory factory, int version) {
super(context, name, factory, version);
c = context;
}
@Override
public void onCreate(SQLiteDatabase db) {
Logd("Sandy", "onCreate database");
//execute when user invoke getReadDatabase/getWriteDatabase
//当用户第一次程序的时候,我们会调用这里,创建我们的表。
dbexecSQL("CREATE TABLE " + RAW_DATA_TABLE + " ("
+ RawData_ID + " INTEGER PRIMARY KEY,"
+ RawDataCOLUMN_ISSUE + " TEXT,"
+ RawDataCOLUMN_NUMBER_ONE + " TEXT,"
+ RawDataCOLUMN_NUMBER_TWO + " TEXT , "
+ RawDataCOLUMN_NUMBER_THREE + " TEXT,"
+ RawDataCOLUMN_NUMBER_FOUR + " TEXT,"
+ RawDataCOLUMN_NUMBER_FIVE + " TEXT,"
+ RawDataCOLUMN_NUMBER_SIX + " TEXT,"
+ RawDataCOLUMN_NUMBER_SEVEN + " TEXT"
+ ");");
ContentValues cv = new ContentValues();
//声明解析文件的文件流对象
InputStream in = null;
BufferedReader reader = null;
try {
//通过AssetManager读取文件
in = cgetResources()getAssets()open("qixingcai-datatxt", AssetManagerACCESS_BUFFER);
//构造BufferedReader对象,以便逐行读取
reader = new BufferedReader(new InputStreamReader(in));
String line ;
//逐行读取文件内容,读取一行,就把这一行数据进行拆分,然后保存进数据库
while((line = readerreadLine()) != null){
cvclear();
//根据分割符"-"和" "进行数据拆分,然后把得到的数据放到ContentValues对象中
String[] issueAndNumber = linesplit("-");
String[] numbers = issueAndNumber[1]split(" ");
cvput(RawDataCOLUMN_ISSUE, issueAndNumber[0]);
cvput(RawDataCOLUMN_NUMBER_ONE, numbers[0]);
cvput(RawDataCOLUMN_NUMBER_TWO, numbers[1]);
cvput(RawDataCOLUMN_NUMBER_THREE, numbers[2]);
cvput(RawDataCOLUMN_NUMBER_FOUR, numbers[3]);
cvput(RawDataCOLUMN_NUMBER_FIVE, numbers[4]);
cvput(RawDataCOLUMN_NUMBER_SIX, numbers[5]);
cvput(RawDataCOLUMN_NUMBER_SEVEN, numbers[6]);
//插入数据库
dbinsert(RAW_DATA_TABLE, "_id", cv);
Logd("Sandy", "issueAndNumber[0]" + issueAndNumber[0]
+ "one: " + numbers[0] + " all: " + issueAndNumber[1]);
}
} catch (IOException e) {
Logd("Sandy", "", e);
}finally{
if (in != null){
try {
inclose();
} catch (IOException e) {
eprintStackTrace();
}
}
if (reader != null){
try {
readerclose();
} catch (IOException e) {
eprintStackTrace();
}
}
}
}
}
可以通过这个方法来找到是否有你要的那个文件: String[] list = null; list = getResources()getAssets()list("abc"); 它返回的是在assets文件夹下abc文件夹中文件的文件名的列表。再去检查list中是否有你需要的文件。
apk安装以后放在/data/app/apk,以apk形式存在,asset/res和apk在一起,并不会解压到/data/data/YourApp目录下去,所以你无法直接获取到assets的绝对路径
只有你有其u3d原文件(工程),才可以在u3d中打开,如果你只有其游戏,用u3d是无法打开的。 如果是有源文件,想导出模型,可以写一段脚本,把unity中的物体转换为obj格式,之后再将obj格式转换为fbx格式,这个脚本需要将物体的顶点、三角形,uv
assets文件夹里面的文件都是保持原始的文件格式,需要用AssetManager以字节流的形式读取文件。
assets的读取方式:
1 先在Activity里面调用getAssets() 来获取AssetManager引用。
2 再用AssetManager的open(String fileName, int accessMode) 方法则指定读取的文件以及访问模式就能得到输入流InputStream。
3 然后就是用已经open file 的inputStream读取文件,读取完成后记得inputStreamclose() 。
4调用AssetManagerclose() 关闭AssetManager。
需要注意的是,来自Resources和Assets 中的文件只可以读取而不能进行写的 *** 作
apk安装以后放在/data/app/apk,以apk形式存在,asset/res和apk在一起,并不会解压到/data/data/YourApp目录下去,所以你无法直接获取到assets的绝对路径
从assets文件夹中读取txt文件 Android除了提供/res目录存放资源文件外,在/assets目录也可以存放资源文件,而且/assets目录下的资源文件不会在Rjava自
以上就是关于读取android中assets中的txt文档。乱码怎么办全部的内容,包括:读取android中assets中的txt文档。乱码怎么办、为什么assets中有文件但读取不了、如何从native层直接获取 assets文件夹下的文件等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)