java解析vcf格式文件导入导出详解编程语言

package com.yfli.test; 
import java.io.BufferedReader; 
import java.io.BufferedWriter; 
import java.io.ByteArrayOutputStream; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.io.PrintWriter; 
import java.io.UnsupportedEncodingException; 
import java.util.ArrayList; 
import java.util.List; 
import java.util.regex.Matcher; 
import java.util.regex.Pattern; 
import org.junit.Test; 
import org.omg.CORBA.SystemException; 
import com.yfli.entity.AddressBean; 
/** 
* .vcf格式文件的导入导出 
* @author yfli 
* 
*/ 
public class ImportVCFTest { 
@Test 
public void importVcf() { 
FileInputStream fis = null; 
try { 
fis = new FileInputStream(new File("src/import_contacts.vcf")); 
List<AddressBean> addressBeans = this.importVCFFileContact(fis); 
System.out.println(addressBeans.size()); 
for (AddressBean addressBean : addressBeans) { 
System.out.println("tureName : " + addressBean.getTrueName()); 
System.out.println("mobile : " + addressBean.getMobile()); 
System.out.println("workMobile : " + addressBean.getWorkMobile()); 
System.out.println("Email : " + addressBean.getEmail()); 
System.out.println("--------------------------------"); 
} 
} catch (FileNotFoundException e) { 
e.printStackTrace(); 
} 
} 
@Test 
public void exportVcf() { 
try { 
List<AddressBean> addressBeans = new ArrayList<AddressBean>(); 
AddressBean addressBean = new AddressBean(); 
addressBean.setTrueName("zhangjie"); 
addressBean.setMobile("18255963695"); 
addressBeans.add(addressBean); 
addressBean = new AddressBean(); 
addressBean.setTrueName("张三"); 
addressBean.setMobile("15255963695"); 
addressBeans.add(addressBean); 
File file = new File("src/export_contacts.vcf"); 
if (file.exists()) { 
file.createNewFile(); 
} 
BufferedWriter reader = new BufferedWriter(new PrintWriter(file)); 
for (AddressBean bean : addressBeans) { 
reader.write("BEGIN:VCARD"); 
reader.write("/r/n"); 
reader.write("VERSION:2.1"); 
reader.write("/r/n"); 
reader.write("N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:" + this.qpEncodeing(bean.getTrueName()) + ";"); 
reader.write("/r/n"); 
if ("" != bean.getMobile() && bean.getMobile() != null) { 
reader.write("TEL;CELL:" + bean.getMobile() + ""); 
reader.write("/r/n"); 
} 
if ("" != bean.getWorkMobile() && bean.getWorkMobile() != null) { 
reader.write("TEL;WORK:" + bean.getWorkMobile() + ""); 
reader.write("/r/n"); 
} 
if ("" != bean.getTelePhone() && bean.getTelePhone() != null) { 
reader.write("TEL;HOME:" + bean.getTelePhone() + ""); 
reader.write("/r/n"); 
} 
if ("" != bean.getEmail() && bean.getEmail() != null) { 
reader.write("EMAIL:" + bean.getEmail() + ""); 
reader.write("/r/n"); 
} 
reader.write("END:VCARD"); 
reader.write("/r/n"); 
} 
reader.flush(); 
reader.close(); 
} catch (Exception e) { 
e.printStackTrace(); 
} 
} 
/** 
* 导入联系人 
* @param in 
* @return 
* @throws SystemException 
*/ 
public static List<AddressBean> importVCFFileContact(InputStream in) 
throws SystemException { 
List<AddressBean> addressBeans = new ArrayList<AddressBean>(); 
try { 
BufferedReader reader = new BufferedReader(new InputStreamReader(in)); 
StringBuffer bu = new StringBuffer(); 
String line; 
while ((line = ImportVCFTest.nextLine(reader)) != null) { 
bu.append(line + "/r/n"); 
} 
Pattern p = Pattern.compile("BEGIN:VCARD(//r//n)([//s//S//r//n//.]*?)END:VCARD"); 
Matcher m = p.matcher(bu.toString()); 
while (m.find()) { 
AddressBean be = new AddressBean(); 
String str = m.group(0); 
Pattern pn = Pattern.compile("N;([//s//S//r//n//.]*?)([//r//n])");// 姓名 
Matcher mn = pn.matcher(m.group(0)); 
while (mn.find()) { 
String name = ""; 
if (mn.group(1).indexOf("ENCODING=QUOTED-PRINTABLE") > -1) { 
name = mn.group(1).substring(mn.group(1).indexOf("ENCODING=QUOTED-PRINTABLE:") + "ENCODING=QUOTED-PRINTABLE:".length()); 
name = name.substring(name.indexOf(":") + 1); 
if (name.indexOf(";") > -1) { 
name = name.substring(0, name.indexOf(";")); 
be.setTrueName(ImportVCFTest.qpDecoding(name)); 
} else { 
be.setTrueName(ImportVCFTest.qpDecoding(name)); 
} 
} else { 
Pattern pnn = Pattern.compile("CHARSET=([A-Za-z0-9-]*?):"); 
Matcher mnn = pnn.matcher(mn.group(1)); 
while (mnn.find()) { 
name = mn.group(1).substring(mn.group(1).indexOf(mnn.group(0)) + mnn.group(0).length()); 
be.setTrueName(name); 
} 
} 
} 
String cell = ""; 
Pattern p1 = Pattern.compile("TEL;CELL:([//s*//d*//s*//d*//s*//d*]*?)([//r//n])"); 
Matcher m1 = p1.matcher(str); 
while (m1.find()) { 
String tel = m1.group(0); 
cell = tel.substring("TEL;CELL:".length()); 
} 
be.setMobile(cell); 
String work = ""; 
Pattern p2 = Pattern.compile("TEL;WORK://d*([//s*//d*//s*//d*//s*//d*]*?)([//r//n])"); 
Matcher m2 = p2.matcher(str); 
while (m2.find()) { 
System.out.println("workTel :  " + m2.group(0)); 
work = m2.group(0).substring(m2.group(0).indexOf("TEL;WORK:") + "TEL;WORK:".length()); 
} 
be.setWorkMobile(work); 
String home = ""; 
Pattern p3 = Pattern.compile("TEL;HOME:([//s*//d*//s*//d*//s*//d*]*?)([//r//n])"); 
Matcher m3 = p3.matcher(str); 
while (m3.find()) { 
home = m3.group(0).substring(m3.group(0).indexOf("TEL;HOME:") + "TEL;HOME:".length()); 
} 
be.setTelePhone(home); 
String email = ""; 
Pattern p4 = Pattern.compile("//w+(//.//w+)*@//w+(//.//w+)+"); 
Matcher m4 = p4.matcher(str); 
while (m4.find()) { 
email = m4.group(0); 
} 
be.setEmail(email); 
addressBeans.add(be); 
} 
reader.close(); 
} catch (Exception e) { 
e.printStackTrace(); 
} 
return addressBeans; 
} 
public static String nextLine(BufferedReader reader) throws IOException { 
String line; 
String nextLine; 
do { 
line = reader.readLine(); 
if (line == null){ 
return null; 
} 
} while (line.length() == 0); 
while (line.endsWith("=")) { 
line = line.substring(0, line.length() - 1); 
line += reader.readLine(); 
} 
reader.mark(1000); 
nextLine = reader.readLine(); 
if ((nextLine != null) && (nextLine.length() > 0) && ((nextLine.charAt(0) == 0x20) || (nextLine.charAt(0) == 0x09))) { 
line += nextLine.substring(1); 
} else { 
reader.reset(); 
} 
line = line.trim(); 
return line; 
} 
/* 
* 解码 
*/ 
public static String qpDecoding(String str) { 
if (str == null) { 
return ""; 
} 
try { 
str = str.replaceAll("=/n", ""); 
byte[] bytes = str.getBytes("US-ASCII"); 
for (int i = 0; i < bytes.length; i++) { 
byte b = bytes[i]; 
if (b != 95) { 
bytes[i] = b; 
} else { 
bytes[i] = 32; 
} 
} 
if (bytes == null) { 
return ""; 
} 
ByteArrayOutputStream buffer = new ByteArrayOutputStream(); 
for (int i = 0; i < bytes.length; i++) { 
int b = bytes[i]; 
if (b == '=') { 
try { 
int u = Character.digit((char) bytes[++i], 16); 
int l = Character.digit((char) bytes[++i], 16); 
if (u == -1 || l == -1) { 
continue; 
} 
buffer.write((char) ((u << 4) + l)); 
} catch (ArrayIndexOutOfBoundsException e) { 
e.printStackTrace(); 
} 
} else { 
buffer.write(b); 
} 
} 
return new String(buffer.toByteArray(), "UTF-8"); 
} catch (Exception e) { 
e.printStackTrace(); 
return ""; 
} 
} 
/* 
* 编码 
*/ 
public static String qpEncodeing(String str) { 
char[] encode = str.toCharArray(); 
StringBuffer sb = new StringBuffer(); 
for (int i = 0; i < encode.length; i++) { 
if ((encode[i] >= '!') && (encode[i] <= '~') && (encode[i] != '=') && (encode[i] != '/n')) { 
sb.append(encode[i]); 
} else if (encode[i] == '=') { 
sb.append("=3D"); 
} else if (encode[i] == '/n') { 
sb.append("/n"); 
} else { 
StringBuffer sbother = new StringBuffer(); 
sbother.append(encode[i]); 
String ss = sbother.toString(); 
byte[] buf = null; 
try { 
buf = ss.getBytes("utf-8"); 
} catch (UnsupportedEncodingException e) { 
e.printStackTrace(); 
} 
if (buf.length == 3) { 
for (int j = 0; j < 3; j++) { 
String s16 = String.valueOf(Integer.toHexString(buf[j])); 
// 抽取中文字符16进制字节的后两位,也就是=E8等号后面的两位, 
// 三个代表一个中文字符 
char c16_6; 
char c16_7; 
if (s16.charAt(6) >= 97 && s16.charAt(6) <= 122) { 
c16_6 = (char) (s16.charAt(6) - 32); 
} else { 
c16_6 = s16.charAt(6); 
} 
if (s16.charAt(7) >= 97 && s16.charAt(7) <= 122) { 
c16_7 = (char) (s16.charAt(7) - 32); 
} else { 
c16_7 = s16.charAt(7); 
} 
sb.append("=" + c16_6 + c16_7); 
} 
} 
} 
} 
return sb.toString(); 
} 
} 

package com.yfli.entity; 
public class AddressBean { 
private String trueName; 
private String mobile; 
private String workMobile; 
private String telePhone; 
private String email; 
public String getTrueName() { 
return trueName; 
} 
public void setTrueName(String trueName) { 
this.trueName = trueName; 
} 
public String getMobile() { 
return mobile; 
} 
public void setMobile(String mobile) { 
this.mobile = mobile; 
} 
public String getWorkMobile() { 
return workMobile; 
} 
public void setWorkMobile(String workMobile) { 
this.workMobile = workMobile; 
} 
public String getTelePhone() { 
return telePhone; 
} 
public void setTelePhone(String telePhone) { 
this.telePhone = telePhone; 
} 
public String getEmail() { 
return email; 
} 
public void setEmail(String email) { 
this.email = email; 
} 
} 

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/16347.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论