赞
踩
iCalendar 简介
iCalendar,简称“iCal”,是“日历数据交换”的标准(RFC 2445),该标准提供了一种公共的数据格式用于存储关于日历方面的信息,比如事件、约定、待办事项等。它不仅允许用户通过电子邮件发送会议或者待办事件等,也允许独立使用,而不局限于某种传输协议。
目前,所有流行日历工具比如:Lotus Notes、Outlook、GMail 和 Apple 的 iCal 都支持 iCalendar 标准,其文件扩展名为 .ical、.ics、.ifb 或者 .icalendar。C&S(Calendaring and Scheduling) 核心对象是一系列日历和行程安排信息。通常情况下,这些日历和行程信息仅仅包含一个 iCalendar 组件(iCalendar 组件分为 Events(VEVENT)、To-do(VTODO)、Journal(VJOURNAL)、Free/busy time (VFREEBUSY)、VTIMEZONE (time zones) 和 VALARM (alarms)),但是多个 iCalendar 组件可以被组织在一起。
C&S 核心对象第一行必须是“BEGIN:VCALENDAR”, 并且最后行必须是“END:VCALENDAR”。在这两行之间主要是由一系列日历属性和一个或者多个 iCalendar 组件组成。
下面看一个例子,它表示发生在 1997 年七月十四日下午五点与 1997 年七月十五日四点之间的事件“Bastille Day Party”。
BEGIN:VCALENDAR ------ 起始
VERSION:2.0 ------ 版本
PRODID:iCal4j v1.0//EN ------ 创建该对象的标志符
BEGIN:VEVENT ------ 事件开始
DTSTART:19970714T170000Z ------ 事件起始时间
DTEND:19970715T040000Z ------ 事件结束时间
SUMMARY:Bastille Day Party ------ 事件概要
END:VEVENT ------ 事件结束
END:VCALENDAR ------ 结束
iCalendar 编程基础
iCal4j 简介
iCal4j(产生于 2004 年 4 月,目前是 2.0 版本),是一组读写 iCalendar 数据流的Java API,支持 iCalendar 规范 RFC 2445,主要包括解析器、对象模型以及生成器。
文件读写
任何一种文件格式读写都是最基本的操作,清单 1 向我们演示了这两项基本操作。CalendarBuilder 对象是用来通过输入流解析和构造 iCalendar 模型。值得注意的是, CalendarBuilder 并不是 线程安全的。
清单 1:iCalendar 文件读写示例
public static void readAndWrite(String in, String out)
throws IOException, ParserException, ValidationException {
FileInputStream fin = new FileInputStream(in);
CalendarBuilder builder = new CalendarBuilder();
Calendar calendar = builder.build(fin);
//TODO: 对 iCalendar 数据进行处理
… …
FileOutputStream fout = new FileOutputStream(out);
CalendarOutputter outputter = new CalendarOutputter();
outputter.output(calendar, fout);
}
iCalendar 索引
对组件和属性进行索引之后,我们可以更加有效的查找组件和属性,通常情况下大家用索引去不断地检查某事件(或约定等)是否存在。假定一个场景,您经常性的需要更新一些日历,并且需要检查事件是否已经存在。因为您需要不断地检查日历中的事件,此时对日历中的事件进行索引将是一件有意义的事情。
清单 2:iCalendar 索引
// 创建索引列表
IndexedComponentList indexedEvents = new IndexedComponentList(
myCalendar.getComponents(Component.VEVENT), Property.UID);
// 检查事件
for (Iterator i=inputCalendar.getComponents(Component.VEVENT).iterator(); i.hasNext();){
VEvent event = (VEvent) i.next();
Component existing = indexedEvents.getComponent(event.getUid().getValue());
if (existing == null) {
myCalendar.getComponents().add(event);
}
else if (!event.equals(existing)) {
// 删除已经存在的事件并添加修改后的事件
myCalendar.getComponents().remove(existing);
myCalendar.getComponents().add(event);
}
}
如清单 2 所示,这里请注意,UID 被用来标示唯一的事件。在得到索引组件列表后,我们就可以通过 UID 来检查某一事件是否存在。如果存在的话
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。