Java制作VCARD

转载自   Java制作VCARD

简介: 

vCard是电子名片的文件格式标准。它一般附加在电子邮件之后,但也可以用于其它场合(如在互联网上相互交换)。vCard可包含的信息有:姓名、地址资讯、电话号码、URL,logo,相片等。


——摘自维基百科https://zh.wikipedia.org/wiki/VCard


vCard规范容许公开交换个人数据交换 (Personal Data Interchange PDI) 信息,在传统纸质商业名片可找到这些信息。规范定义电子名片(或叫vCard)的格式。 vCard 规范可作为各种应用或系统之间的交换格式。定义的格式与传送的方法无关。传送交换可能是文件系统,点对点交换的公共电话网络,以有线网络或无线传送的方式。用户能在互联网上直接利用vCard。电子邮件能转发在vCard中人信息。网页上很多用户填写的表格可自动使用vCard。


——摘自百度百科http://baike.baidu.com/view/495045.htm


以上就是关于vCard的基本介绍,维基百科(英文)https://en.wikipedia.org/wiki/VCard写的比较全,可惜我看不懂。关于vCard格式介绍的文章网上也有很多,我就不再一一阐述。但是关于Java操作vCard的例子却不是很多了,有些也就是自己单单写的一个解析类,于是我漫游网络,最终找到了ez-vcard,我不知道还有没有别的库能操作vCard的,肯定有,但是我也懒得去找了,反正这个可以用就行了。╮( ̄▽ ̄)╭


ez-vcard: 

github主页:https://github.com/mangstadt/ez-vcard


下载地址:https://github.com/mangstadt/ez-vcard/wiki/Downloads


API文档:http://mangstadt.github.io/ez-vcard/javadocs/latest/index.html


参考资料:https://github.com/mangstadt/ez-vcard/wiki


Maven



com.googlecode.ez-vcard 
ez-vcard 
... 

Gradle


compile 'com.googlecode.ez-vcard:ez-vcard:0.9.11' 

ez-vcard可以操作vCard、xCard、jCard、hCard,在这里,我主要介绍vCard的写操作。


我们首先新建一个项目,我这里使用的是Intellij IDEA创建的Mavenx项目,如果不是Maven项目,也可以直接导入jar包使用


新建vacrd.properties用于模拟数据


vcard.name=张三 
vcard.address=湖北武汉 
aliyunzixun@xxx.com  
vcard.mobile=182****2658 
vcard.phone=027-49***44 
vcard.fax=49**46 
vcard.org=武汉家里蹲股份有限公司 
vcard.role=软件开发员 
vcard.title=投研产品事业部 
vcard.url=http://www.whjld.com/san.zhang 
vcard.qq=32*****44 
vcard.weixin=zhangsan 
vcard.weibo=http://weibo.com/zhangsan 

新建VCardUtil.java


编写getProperties()方法用于读取资源文件

/** 
* 读取资源文件 
* @return Properties 
*/ 
public Properties getProperties(){ 
//读取资源文件 
InputStream resourceAsStream = this.getClass().getClassLoader() 
.getResourceAsStream("vcard.properties"); 
Properties properties = new Properties(); 
try { 
//使用字符流,防止中文乱码 
BufferedReader bufferedReader = new BufferedReader( 
new InputStreamReader(resourceAsStream,"UTF-8")); 
properties.load(bufferedReader); 
} catch (IOException e) { 
e.printStackTrace(); 
} 
return properties; 
} 

然后开始编写createVCard(Properties);


首先new一个VCard实体类


VCard vcard = new VCard(); 

以Email为例,添加属性


新建email,添加内容


Email email = new Email(properties.getProperty("vcard.email")); 

添加Email的类别为INTERNET,关于类别,可以去查看vCard规范


email.getTypes().add(EmailType.INTERNET); 

当添加多个邮箱后,可以设置优先级


email.setPref(1); 

有关属性设置完后,将属性添加进vCard中


vcard.addEmail(email); 

其他属性基本类似,具体可以查看官方API,值得一提的是PHOTO使用的是图片的base64,我们可以直接使用以下方式进行添加

Photo photo = new Photo(new File("D://photo.jpg"), ImageType.JPEG); 

关于自定义属性

VCardProperty QQ = new RawProperty("X-QQ", properties.getProperty("vcard.qq")); 
vcard.addProperty(QQ); 

所有属性添加完成后,编写main方法

public static void main(String[] args) { 
VCardUtil vCardUtil = new VCardUtil(); 
VCard vCard = vCardUtil.createVCard(vCardUtil.getProperties()); 
String s = Ezvcard.write(vCard).version(VCardVersion.V4_0).go(); 
System.out.println(s); 
} 

设置vCard的版本号为4.0,运行结果如下


BEGIN:VCARD 
VERSION:4.0 
PRODID:ez-vcard 0.9.11 
N:;张三;;; 
FN:张三 
ADR;TYPE=dom;TZ=UTC+8:;;湖北武汉;;;; 
EMAIL;TYPE=internet;PREF=1:  aliyunzixun@xxx.com  
TEL;TYPE=cell:182****2658 
TEL;TYPE=work:027-49***44 
TEL;TYPE=fax:49**46 
ORG:武汉家里蹲股份有限公司 
ROLE:软件开发员 
TITLE:投研产品事业部 
URL:http://www.whjld.com/san.zhang 
X-QQ:32*****44 
X-WEIXIN:zhangsan 
X-WEIBO:http://weibo.com/zhangsan 
END:VCARD 

上面没有添加PTOTO,如果添加了PHOTO,你会发现一件奇怪的事,代码一行过长后会自动换行,并且在第二行会加一个空格,导致文件不能正常使用(如果你们可以正常使用,当我没说)。


BEGIN:VCARD 
VERSION:4.0 
PRODID:ez-vcard 0.9.11 
N:;张三;;; 
FN:张三 
ADR;TYPE=dom;TZ=UTC+8:;;湖北武汉;;;; 
EMAIL;TYPE=internet;PREF=1:  aliyunzixun@xxx.com  
TEL;TYPE=cell:182****2658 
TEL;TYPE=work:027-49***44 
TEL;TYPE=fax:49**46 
ORG:武汉家里蹲股份有限公司 
ROLE:软件开发员 
TITLE:投研产品事业部 
PHOTO:data:image/jpeg;base64,/9j/4RR6RXhpZgAATU0AKgAAAAgABwESAAMAAAABAAEAAA 
EaAAUAAAABAAAAYgEbAAUAAAABAAAAagEoAAMAAAABAAIAAAExAAIAAAAcAAAAcgEyAAIAAAAU 
AAAAjodpAAQAAAABAAAApAAAANAADqYAAAAnEAAOpgAAACcQQWRvYmUgUGhvdG9zaG9wIENTNS 
BXaW5kb3dzADIwMTY6MDQ6MDggMTA6MTQ6MDUAAAAAA6ABAAMAAAAB//8AAKACAAQAAAABAAAE 
AKADAAQAAAABAAADAAAAAAAAAAAGAQMAAwAAAAEABgAAARoABQAAAAEAAAEeARsABQAAAAEAAA 
EmASgAAwAAAAEAAgAAAgEABAAAAAEAAAEuAgIABAAAAAEAABNEAAAAAAAAAEgAAAABAAAASAAA 
AAH/2P/tAAxBZG9iZV9DTQAC/+4ADkFkb2JlAGSAAAAAAf/bAIQADAgICAkIDAkJDBELCgsRFQ 
8MDA8VGBMTFRMTGBEMDAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAENCwsNDg0Q 
Dg4QFA4ODhQUDg4ODhQRDAwMDAwREQwMDAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA 
wM/8AAEQgAeACgAwEiAAIRAQMRAf/dAAQACv/EAT8AAAEFAQEBAQEBAAAAAAAAAAMAAQIEBQYH 
CAkKCwEAAQUBAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAABBAEDAgQCBQcGCAUDDDMBAAIRAw 
QhEjEFQVFhEyJxgTIGFJGhsUIjJBVSwWIzNHKC0UMHJZJT8OHxY3M1FqKygyZEk1RkRcKjdDYX 
0lXiZfKzhMPTdePzRieUpIW0lcTU5PSltcXV5fVWZnaGlqa2xtbm9jdHV2d3h5ent8fX5/cRAA 
ICAQIEBAMEBQYHBwYFNQEAAhEDITESBEFRYXEiEwUygZEUobFCI8FS0fAzJGLhcoKSQ1MVY3M0 



//代码太长,只截取一部分 

查阅API之后,发现他有专门的 Writer方法,并且可以设置每行的长度,Writer方法可以写到OutputStream、Writer、File里面,更具情况可以自行选择。


添加getStringVCard() 测试

/** 
* 获取字符串形式的vcard 
* @param vCard vcard 
* @return 
*/ 
public String getStringVCard(VCard vCard){ 
CharArrayWriter charArrayWriter = new CharArrayWriter(); 
VCardWriter vCardWriter = null; 
try { 
//定义vcard输出流 
vCardWriter = new VCardWriter(charArrayWriter,VCardVersion.V3_0); 
//设置每行的长度,null为不限制 
vCardWriter.getRawWriter().getFoldedLineWriter().setLineLength(null); 
//讲vCard写到输出流里面 
vCardWriter.write(vCard); 
} catch (IOException e) { 
e.printStackTrace(); 
}finally { 
if (vCardWriter != null) try { 
vCardWriter.close(); 
} catch (IOException e) { 
e.printStackTrace(); 
} 
} 
return charArrayWriter.toString(); 
} 

官方也给出了输出到File的例子,和一些设置信息


Example:

VCard vcard1 = ... 
VCard vcard2 = ... 
File file = new File("vcard.vcf"); 
VCardWriter writer = null; 
try { 
writer = new VCardWriter(file, VCardVersion.V3_0); 
writer.write(vcard1); 
writer.write(vcard2); 
} finally { 
if (writer != null) writer.close(); 
} 
Changing the line folding settings:VCardWriter writer = new VCardWriter(...);//disable line folding 
writer.getRawWriter().getFoldedLineWriter().setLineLength(null);//change line length 
writer.getRawWriter().getFoldedLineWriter().setLineLength(50);//change folded line indent string 
writer.getRawWriter().getFoldedLineWriter().setIndent("/t");//change newline character 
writer.getRawWriter().getFoldedLineWriter().setNewline("**"); 
后记: 

目前可能部分手机不支持4.0格式的vCard,比如猴米就只支持3.0格式的


小米手机关于3.0版本头像支持问题


3.0版本的PHOTO格式为:


PHOTO;ENCODING=b;TYPE=jpeg:…… 

维基百科上写的也是ENCODING=b


华为,苹果的都可以正常显示,但是小米手机显示不了头像,改成ENCODING=BASE64,就可以显示了,可能是小米的解析的问题

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/328764.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java反射机制的简单使用和优缺点

java反射机制的使用 一、反射是什么? JAVA反射机制是在运行状态中,对于任意一个类,都能够获取这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取类信息以及动态调…

有关技术分享

有人说,如果你想掌握好一门技术,那么最好的方式就是去当老师,去教会别人这门技术。在教别人的过程中,你必须要去深入的了解这门技术的方方面面,同时还要思考怎么才能让别人理解。每一个做过的人都知道,这要…

不可重复 幻读

幻读和不可重复读的区别 2014年09月15日 20:51:27 阅读数:26195 MySQl MySql默认的隔离级别为Repeatable Read,因此只会出现幻读的情况。 幻读 事务在插入已经检查过不存在的记录时,惊奇的发现这些数据已经存在了,之前的检测…

java生成验证码

转载自 java生成验证码 源码: package seed.lee.image;import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.IOException; import java.util.Random;import javax.imageio.ImageIO; …

ASP.NET Core 中文文档 第三章 原理(5)错误处理

原文:Error Handling作者:Steve Smith翻译:谢炀(Kiler)校对:高嵩(jack2gs)、何镇汐 当你的ASP.NET应用发生错误的时候, 你可以采用本文所述的各种方法来处理这些问题。 配置错误处理页面 你在 Startup 类的 Configure(…

java面向对象高级分层实例_接口类

package bdqn.studentSys.Dao;import java.util.List;import bdqn.studentSys.entity.Student;/*** 学生表的接口* author Administrator**/ public interface StudentDao {//查询所有的学生public List<Student> getAllStudent();//修改学生信息public int UpdateStuden…

杀死进程

-- 杀死进程端口 netstat -aon|findstr "8086" taskkill /PID 9160 /f

菜鸟学Java(六)——简单验证码生成(Java版)

转载自 菜鸟学Java&#xff08;六&#xff09;——简单验证码生成(Java版)验证码大家都知道&#xff0c;它的作用也不用我多说了吧。如果不太清楚请参见百度百科中的解释&#xff0c;一般验证码的生成就是随机产生字符&#xff08;数字、字母或者汉字等&#xff09;&#xff0…

对象集合中如何用对象的某个属性给对象排序?

这是在工作中遇到的一个问题。用到的持久层技术是mybatis-plus&#xff0c;它里面自带的条件对象wrapper&#xff0c;我们可以通过wrapper.orderByDesc()或者wrapper.orderByAsc()给我们list中的对象排序。 但是问题来了&#xff0c;如果公司在基于这个框架的基础上写了一个通用…

你知道C#中的Lambda表达式的演化过程吗

那得从很久很久以前说起了&#xff0c;记得那个时候... 懵懂的记得从前有个叫委托的东西是那么的高深难懂。 委托的使用 例一&#xff1a; 什么是委托&#xff1f; 个人理解&#xff1a;用来传递方法的类型。&#xff08;用来传递数字的类型有int、float、double&#xff0c;用…

拦截第三方快递物流 ,console控制台打印正常 ,浏览器显示正常 ,传至后台乱码

使用 apache.http. 可以解决 压缩的json文件 浏览器会自动解压但我们的后台不会package com.zjyouth.utils;import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.…

java面向对象高级分层实例_数据库操作类

package bdqn.studentSys.Dao.impl; /**** 学生表的数据库操作类*/ import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List;import bdqn.studentSys.Dao.BaseDao; import bdqn.studentSys.Dao.StudentDao; import bdqn…

shiro-权限概述

一、什么是权限 权限管理&#xff0c;一般根据系统的安全设置或安全规则&#xff0c;用户可以且只能访问自己被授予的资源。只要有用户名和密码&#xff0c;就一定会存在权限。 二、权限分类 访问权限 作为一个使用者或是访问者&#xff0c;你能够被允许看到的那些资源。 数…

ASP.NET Core Kestrel 中使用 HTTPS (SSL)

在ASP.NET Core中&#xff0c;如果在Kestrel中想使用HTTPS对站点进行加密传输&#xff0c;可以按照如下方式 申请证书 这一步就不详细说了&#xff0c;有免费的和收费的&#xff0c;申请完成之后会给你一个*.pfx结尾的文件。 添加NuGet包 nuget中查找然后再程序中添加引用Micro…

idea

war 发布 war explord 开发

Java最小堆解决TopK问题

转载自 Java最小堆解决TopK问题 TopK问题是指从大量数据&#xff08;源数据&#xff09;中获取最大&#xff08;或最小&#xff09;的K个数据。 TopK问题是个很常见的问题&#xff1a;例如学校要从全校学生中找到成绩最高的500名学生&#xff0c;再例如某搜索引擎要统计每天…

Shiro-概述

一、什么是Shiro shiro是Apache旗下的一个开源框架&#xff0c;将软件系统的安全认证相关功能抽取出来&#xff0c;实现用户身份证&#xff0c;权限授权&#xff0c;加密&#xff0c;会话等功能&#xff0c;组成一个通用的安全认证框架。 二、特点 易于理解的java security …

ASP.NET Core 缓存技术 及 Nginx 缓存配置

前言 在Asp.Net Core Nginx部署一文中&#xff0c;主要是讲述的如何利用Nginx来实现应用程序的部署&#xff0c;使用Nginx来部署主要有两大好处&#xff0c;第一是利用Nginx的负载均衡功能&#xff0c;第二是使用Nginx的反向代理来降低我们后端应用程序的压力。那除了以上两点之…

localStorage、sessionStorage、Cookie的区别及用法

localStorage、sessionStorage、Cookie https://segmentfault.com/a/1190000012057010 localStorage、sessionStorage、Cookie的区别及用法 webstorage webstorage是本地存储&#xff0c;存储在客户端&#xff0c;包括localStorage和sessionStorage。 localStorage localSto…

shiro入门

一、身份认证 基本流程 流程如下&#xff1a; shiro把用户的数据封装成标识token&#xff0c;token一般封装着用户名&#xff0c;密码等信息使用Subject获取到封装着用户的数据标识tokenSubject将token交给SecurityManager&#xff0c;在SecurityManager安全中心中&#xff…