android中读取txt文件内容防止出现乱码

本人前段时间写了一个小的android上的txt文件内容读取的小程序,小文件可以直接一次性读取,对运行速度的影响可以忽略,但是大文件使用FileInputStream读取如果一次性读取影响就很大了。



后来为了不影响速度决定让程序分线程出来,先获取一段内容显示在textview上,之后的在台获取添加上去,这其中涉及到如何正确截取FileInputStream的内容防止出现乱码的问题。因为文档中很有可能包含中文,而中文可能是两个字节或三个字节,可以一次取x个字节,另一次去x+1个字节,判断两次取得文件转换成String类型数据后的长度是否不同,如不同则表示可以在此处截取内容,如相同则表示在此处截取会造成乱码。下面是我的实现方法。


public class Data {
private String res;
private int fistag;
private boolean all=false;

public Data() {
// TODO Auto-generated constructor stub
}

public String getRes() {
return res;
}

public void setRes(String res) {
this.res = res;
}

public int getFistag() {
return fistag;
}

public void setFistag(int fistag) {
this.fistag = fistag;
}

public boolean isall() {
return all;
}

public void setall(boolean all) {
this.all = all;
}
}


public class Getcontent {

Data data = new Data();

public Data getcontent(String filename, int fistag) {//fistag相当与指针,表示之前已获得的内容
// TODO Auto-generated constructor stub


boolean getall = false;//用于判断是否获得了所有的内容
String res = "";
int change = 0;//偏移量

String style=getCharset(filename);//获取文件的编码格式
try {
FileInputStream fin = new FileInputStream(filename);
byte[] buffer;
buffer = new byte[fistag];
fin.read(buffer);//取出之前已获得的内容
int a = fin.available();//查看还剩多少内容
if (10000 >= a) {//我设置的每次取得字节数最少为10000,此处判断剩下的内容是否能一次取完
buffer = new byte[a];
fin.read(buffer);
res = EncodingUtils.getString(buffer,style);// //依Y.txt的编码类型选择合适的编码,如果不调整会乱码
getall = true;
} else {
boolean bool = false;//是否可以截取
while (!bool) {
//一次取10000个字节,另一次去10001个字节,判断两次取得文件转换成String类型数据后的长度是否不同,如不同则表示可以在此处截取内容,如相同则表示在此处截取会造成乱码
FileInputStream fina = new FileInputStream(filename);
FileInputStream finb = new FileInputStream(filename);
fina.read(buffer);
finb.read(buffer);
byte[] buffera;
byte[] bufferb;
buffera = new byte[10000 + judge];
bufferb = new byte[10000 + judge + 1];
fina.read(buffera);
finb.read(bufferb);
int numbera = EncodingUtils.getString(buffera,
style).length();
int numberb = EncodingUtils.getString(bufferb,
style).length();
if (numberb > numbera) {
res = EncodingUtils.getString(buffera,
style);
bool = true;
} else {
change += 1;
}
fina.close();
finb.close();
}
}
fin.close();// 关闭资源
} catch (Exception e) {
e.printStackTrace();
}
data.setFistag(change);
data.setall(getall);
data.setRes(res);
return data;
}

private String getCharset(String fileName) throws IOException {
BufferedInputStream bin = new BufferedInputStream(new FileInputStream(
fileName));
int p = (bin.read() << 8) + bin.read();
bin.close();
String code = null;
switch (p) {
case 0xefbb:
code = "UTF-8";
break;
case 0xfffe:
code = "UTF-16LE";
break;
case 0xfeff:
code = "UTF-16BE";
break;
default:
code = "GBK";
}
return code;
}
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值