cardme包部分知识扩充链接地址:使用cardme读写VCard文件,实现批量导入导出电话簿
我已经打包到百度云网盘,里面有源码和jar包,需要的可以下载:
链接:http://pan.baidu.com/s/1mgGOiHa 密码:n6bk
官方下载地址,最新的是0.4.0版本:cardme
在此我花了将近一天的时间,来解决乱码问题,在此类中方法getContentFromFile(File vcardFile)中有一个语句,是按照utf-8的编码来操作vcf文件的,我用工具(360手机助手)导出的vcf文件编码是gb2312的,因此在此读入字符流后,编码格式不一致,出现乱码。
接下来修改源码。什么源码不能修改???那你可以在你的工程里新建一个包名一模一样的(net.sourceforge.cardme.engine),然后新建一个VCardEngine类,把源码复制粘贴过去,这时就可以随意更改了。
我们知道类加载的时候是先找自定义的类,如果找不到才去加载你引入的类。
net.sourceforge.cardme.engine.VCardEngine本来的源码是:
private String getContentFromFile(File vcardFile) throws IOException
{
return getContent(new InputStreamReader(new FileInputStream(vcardFile), Charset.forName("UTF-8")));
}
更改后的源码是:
BufferedInputStream bin = new BufferedInputStream(
new FileInputStream(vcardFile));
int p = (bin.read() << 8) + bin.read();
String code = null;
switch (p) {
case 0xefbb:
code = "UTF-8";
break;
case 0xfffe:
code = "Unicode";
break;
case 0xfeff:
code = "UTF-16BE";
break;
default:
code = "GBK";
}
InputStreamReader isr = new InputStreamReader(new FileInputStream(vcardFile), Charset.forName(code));
return getContent(isr);
p是为了识别该编码是,然后按对应编码进行读取文件。
import java.io.File;
import java.io.IOException;
import java.util.List;
import net.sourceforge.cardme.engine.VCardEngine;
import net.sourceforge.cardme.vcard.VCard;
import net.sourceforge.cardme.vcard.exceptions.VCardParseException;
import net.sourceforge.cardme.vcard.types.NType;
import net.sourceforge.cardme.vcard.types.TelType;
public class ReadVCFFile {
public static void main(String args[]){
String filePath = "F://contact.vcf";
File file = new File(filePath);
VCardEngine vce = new VCardEngine();//new一个vcard引擎
try {
/*
* 一个vcf文件中的联系人不止有一个,我们使用parseMultiple来
* 操作文件,如果只有一个的话 ,使用parse(file)即可。
* 一个联系人对应一个VCard对象;我们读的vcf文件有多个联系人,因此
* 用List来存储。
*
* */
List<VCard> vcards = vce.parseMultiple(file);
for (VCard vCard : vcards) {
NType nt = vCard.getN();//其中姓名等信息存储在NType对象中
String fname= "姓名:";
String gname = "";
if (nt!=null) {
/*我们知道外国的姓名是FamilyName+GivenName
* 在我们中文名,也可以用此来记录姓名。看你的联系
* 人是怎么存储的啦!
*/
fname = fname+nt.getFamilyName();
gname = nt.getGivenName();
}
//为什么用list存储每个人的联系电话,因为我们知道通讯录里
//可以记录多个联系电话。
List<TelType> teltype = vCard.getTels();
System.out.println(fname);
/*某些用户就是不让人省心,只写联系人姓名,不填电话号码
* 真是的,我们只能来个判断了。
*/
if (teltype!=null&&teltype.size()!=0) {
for (TelType telType2 : teltype) {
//循环打印出该联系人的联系电话;
System.out.println(telType2.getTelephone());
}
}
}
} catch (IOException e) {
e.printStackTrace();
} catch (VCardParseException e) {
e.printStackTrace();
}
}
}
好啦!祝您好运!