读取android中assets中的txt文档。乱码怎么办? 5

 我来答
墨紫音
2015-10-02 · TA获得超过1.8万个赞
知道大有可为答主
回答量:2390
采纳率:56%
帮助的人:1232万
展开全部
一. 前言
最近自己写一个程序,需要把文本文件里面的一些数据在程序第一次启动的时候初始化到数据库中去。所以就涉及到了读取文件的操作。在我们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方法,这个方法会在我们第一次调用db.getReadDatabase()或者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) {
Log.d("Sandy", "onCreate database");
//execute when user invoke getReadDatabase/getWriteDatabase
//当用户第一次程序的时候,我们会调用这里,创建我们的表。
db.execSQL("CREATE TABLE " + RAW_DATA_TABLE + " ("
+ RawData._ID + " INTEGER PRIMARY KEY,"
+ RawData.COLUMN_ISSUE + " TEXT,"
+ RawData.COLUMN_NUMBER_ONE + " TEXT,"
+ RawData.COLUMN_NUMBER_TWO + " TEXT , "
+ RawData.COLUMN_NUMBER_THREE + " TEXT,"
+ RawData.COLUMN_NUMBER_FOUR + " TEXT,"
+ RawData.COLUMN_NUMBER_FIVE + " TEXT,"
+ RawData.COLUMN_NUMBER_SIX + " TEXT,"
+ RawData.COLUMN_NUMBER_SEVEN + " TEXT"
+ ");");

ContentValues cv = new ContentValues();
//声明解析文件的文件流对象
InputStream in = null;
BufferedReader reader = null;
try {
//通过AssetManager读取文件
in = c.getResources().getAssets().open("qixingcai-data.txt", AssetManager.ACCESS_BUFFER);
//构造BufferedReader对象,以便逐行读取
reader = new BufferedReader(new InputStreamReader(in));
String line ;
//逐行读取文件内容,读取一行,就把这一行数据进行拆分,然后保存进数据库
while((line = reader.readLine()) != null){
cv.clear();
//根据分割符"-"和" "进行数据拆分,然后把得到的数据放到ContentValues对象中
String[] issueAndNumber = line.split("-");
String[] numbers = issueAndNumber[1].split(" ");
cv.put(RawData.COLUMN_ISSUE, issueAndNumber[0]);
cv.put(RawData.COLUMN_NUMBER_ONE, numbers[0]);
cv.put(RawData.COLUMN_NUMBER_TWO, numbers[1]);
cv.put(RawData.COLUMN_NUMBER_THREE, numbers[2]);
cv.put(RawData.COLUMN_NUMBER_FOUR, numbers[3]);
cv.put(RawData.COLUMN_NUMBER_FIVE, numbers[4]);
cv.put(RawData.COLUMN_NUMBER_SIX, numbers[5]);
cv.put(RawData.COLUMN_NUMBER_SEVEN, numbers[6]);

//插入数据库
db.insert(RAW_DATA_TABLE, "_id", cv);

Log.d("Sandy", "issueAndNumber[0]" + issueAndNumber[0]
+ "one: " + numbers[0] + " all: " + issueAndNumber[1]);
}

} catch (IOException e) {
Log.d("Sandy", "", e);
}finally{
if (in != null){
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (reader != null){
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
低调的白手
2015-10-31 · TA获得超过1.1万个赞
知道小有建树答主
回答量:1192
采纳率:76%
帮助的人:181万
展开全部
一般为两种编码格式 GBK或者UTF8。乱码是因为你项目的编码与.txt中的编码不同
Result = new String(Result.getBytes("GBK"), "ISO_8859_1");

你可以参考上面这个函数,对内容做编码转换。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
Q小齐666
推荐于2016-06-19 · TA获得超过947个赞
知道小有建树答主
回答量:116
采纳率:50%
帮助的人:53.5万
展开全部
其实就一句话:保证你文件的编码方式和解码方式一致就可以了。

如果你仅仅是读取外部的文件,那麼接下来这麼用:

try {
InputStream mInputStream = context.getAssets().open("text2.txt");
BufferedReader mReader = new BufferedReader(new InputStreamReader(
mInputStream, "UTF-8"));

mReadResult = mReader.readLine();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

不过对於ANSI格式的文件现在还没有找到正确读取的办法,摸索中...

如果你先写入文件,再读出文件,为了保证编码的一致性,接下来这样用:

public static String encodin = "UTF8"
public static String encodout = "UTF8"
static void writeOutput(String str) {
try {
FileOutputStream fos = new FileOutputStream("test.txt");
Writer out = new OutputStreamWriter(fos, encodout);
out.write(str);
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
static String readInput() {
StringBuffer buffer = new StringBuffer();
try {
FileInputStream fis = new FileInputStream("test.txt");
InputStreamReader isr = new InputStreamReader(fis, encodin);
Reader in = new BufferedReader(isr);
int ch;
while ((ch = in.read()) > -1) {
buffer.append((char)ch);
}
in.close();
return buffer.toString();
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
剧纬品0f
2012-07-19 · 超过19用户采纳过TA的回答
知道答主
回答量:81
采纳率:0%
帮助的人:36.7万
展开全部
一般为两种编码格式 GBK或者UTF8。乱码是因为你项目的编码与.txt中的编码不同
Result = new String(Result.getBytes("GBK"), "ISO_8859_1");

你可以参考上面这个函数,对内容做编码转换。
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
暴风橘子猫Ey
2012-07-16 · 超过16用户采纳过TA的回答
知道答主
回答量:72
采纳率:0%
帮助的人:49.9万
展开全部
解码的格式不对,你先取下文件的编码格式,按照他的编码格式在解码。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(4)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式