java 解析 ical_转载iCalendar 编程基础:了解和使用 iCal4j

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 来检查某一事件是否存在。如果存在的话

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值