Java cal4j-意外的文件结束异常

Java cal4j-意外的文件结束异常,java,ical4j,Java,Ical4j,我目前不知道这里有什么问题,我请求帮助 我正在生成一个ics文件。 但是,如果我想打开ics文件以获取日历,我会收到以下错误消息: net.fortuna.ical4j.data.ParserException:第1行错误:文件意外结束 以下是我的信息: ical4j版本3.0.1 Java:8构建181 ics文件的我的输出: public void createEvent(BookingDate bookingDate, Mandatory mandatory, Employee emplo

我目前不知道这里有什么问题,我请求帮助

我正在生成一个ics文件。 但是,如果我想打开ics文件以获取日历,我会收到以下错误消息:

net.fortuna.ical4j.data.ParserException:第1行错误:文件意外结束

以下是我的信息: ical4j版本3.0.1 Java:8构建181

ics文件的我的输出:

public void createEvent(BookingDate bookingDate, Mandatory mandatory, Employee employee)
        throws FileNotFoundException, IOException, ParserException, ConstraintViolationException {

    // Create a TimeZone
    System.setProperty("net.fortuna.ical4j.timezone.cache.impl", MapTimeZoneCache.class.getName());

    TimeZoneRegistry registry = TimeZoneRegistryFactory.getInstance().createRegistry();
    TimeZone timezone = registry.getTimeZone("Europe/Berlin");
    VTimeZone tz = timezone.getVTimeZone();

    String pathMandatoryFile = null;
    String pathEmployeeFile = null;

    // Reading the file and creating the calendar
    Calendar icsCalendar = null;
    FileOutputStream fout = null;

    if (bookingDate.isCreateCalendarMandatoryEntry()) {
        // timezone = registry.getTimeZone(mandatory.getTimeZone());

        pathMandatoryFile = "calendar.ics";
        fout = new FileOutputStream(pathMandatoryFile);
        try {
            FileInputStream fin = new FileInputStream(pathMandatoryFile);
            CalendarBuilder builder = new CalendarBuilder();
            icsCalendar = builder.build(fin);
        } catch (Exception e) {

        }

        if (icsCalendar == null) {
            icsCalendar = createNewCalender(pathMandatoryFile);
        }
    }

    // Creating an event
    java.util.Calendar startCal = java.util.Calendar.getInstance(timezone);
    startCal.set(java.util.Calendar.YEAR, bookingDate.getStartDate().getYear());
    startCal.set(java.util.Calendar.MONTH, bookingDate.getStartDate().getMonth());
    startCal.set(java.util.Calendar.DAY_OF_MONTH, bookingDate.getStartDate().getDate());
    startCal.set(java.util.Calendar.HOUR_OF_DAY, bookingDate.getStartDate().getHours());
    startCal.clear(java.util.Calendar.MINUTE);
    startCal.clear(java.util.Calendar.SECOND);

    java.util.Calendar endCal = java.util.Calendar.getInstance(timezone);
    endCal.set(java.util.Calendar.YEAR, bookingDate.getEndDate().getYear());
    endCal.set(java.util.Calendar.MONTH, bookingDate.getEndDate().getMonth());
    endCal.set(java.util.Calendar.DAY_OF_MONTH, bookingDate.getEndDate().getDate());
    endCal.set(java.util.Calendar.HOUR_OF_DAY, bookingDate.getEndDate().getHours());
    endCal.clear(java.util.Calendar.MINUTE);
    endCal.clear(java.util.Calendar.SECOND);

    net.fortuna.ical4j.model.DateTime dtStart = new DateTime(startCal.getTime());
    net.fortuna.ical4j.model.DateTime dtEnd = new DateTime(endCal.getTime());


    String eventName = bookingDate.getName();
    VEvent meeting = new VEvent(dtStart, dtEnd, eventName);

    // add timezone info..
    meeting.getProperties().add(tz.getTimeZoneId());
    String uidValue = bookingDate.getIdHash();
    meeting.getProperties().add(new Uid(uidValue));

    // Add the event and print
    icsCalendar.getComponents().add(meeting);

    CalendarOutputter outputter = new CalendarOutputter();
    outputter.output(icsCalendar, fout);

}


private Calendar createNewCalender(String filePath) throws ValidationException, IOException {

    // Saving an iCalendar file
    FileOutputStream fout = new FileOutputStream(filePath);

    Calendar calendar = new Calendar();
    calendar.getProperties().add(new ProdId("-//Ben Fortuna//iCal4j 1.0//EN"));
    calendar.getProperties().add(Version.VERSION_2_0);
    calendar.getProperties().add(CalScale.GREGORIAN);

    return calendar;
}
BEGIN:VCALENDAR产品ID:-//Ben Fortuna//iCal4j 1.0//EN版本:2.0 CALSCALE:GREGORIAN BEGIN:VEVENT DTSTAMP:20180826T16552Z DTSTART:01180905T000000 DTEND:01180905T000000摘要:ddd TZID:欧洲/柏林 UID:1535302250819-9ed0489f-0320-4a66-8f9c-4AF0E62CDED结束:VEVENT 完:VCALENDAR

下面是生成calender.ics文件的代码:

public void createEvent(BookingDate bookingDate, Mandatory mandatory, Employee employee)
        throws FileNotFoundException, IOException, ParserException, ConstraintViolationException {

    // Create a TimeZone
    System.setProperty("net.fortuna.ical4j.timezone.cache.impl", MapTimeZoneCache.class.getName());

    TimeZoneRegistry registry = TimeZoneRegistryFactory.getInstance().createRegistry();
    TimeZone timezone = registry.getTimeZone("Europe/Berlin");
    VTimeZone tz = timezone.getVTimeZone();

    String pathMandatoryFile = null;
    String pathEmployeeFile = null;

    // Reading the file and creating the calendar
    Calendar icsCalendar = null;
    FileOutputStream fout = null;

    if (bookingDate.isCreateCalendarMandatoryEntry()) {
        // timezone = registry.getTimeZone(mandatory.getTimeZone());

        pathMandatoryFile = "calendar.ics";
        fout = new FileOutputStream(pathMandatoryFile);
        try {
            FileInputStream fin = new FileInputStream(pathMandatoryFile);
            CalendarBuilder builder = new CalendarBuilder();
            icsCalendar = builder.build(fin);
        } catch (Exception e) {

        }

        if (icsCalendar == null) {
            icsCalendar = createNewCalender(pathMandatoryFile);
        }
    }

    // Creating an event
    java.util.Calendar startCal = java.util.Calendar.getInstance(timezone);
    startCal.set(java.util.Calendar.YEAR, bookingDate.getStartDate().getYear());
    startCal.set(java.util.Calendar.MONTH, bookingDate.getStartDate().getMonth());
    startCal.set(java.util.Calendar.DAY_OF_MONTH, bookingDate.getStartDate().getDate());
    startCal.set(java.util.Calendar.HOUR_OF_DAY, bookingDate.getStartDate().getHours());
    startCal.clear(java.util.Calendar.MINUTE);
    startCal.clear(java.util.Calendar.SECOND);

    java.util.Calendar endCal = java.util.Calendar.getInstance(timezone);
    endCal.set(java.util.Calendar.YEAR, bookingDate.getEndDate().getYear());
    endCal.set(java.util.Calendar.MONTH, bookingDate.getEndDate().getMonth());
    endCal.set(java.util.Calendar.DAY_OF_MONTH, bookingDate.getEndDate().getDate());
    endCal.set(java.util.Calendar.HOUR_OF_DAY, bookingDate.getEndDate().getHours());
    endCal.clear(java.util.Calendar.MINUTE);
    endCal.clear(java.util.Calendar.SECOND);

    net.fortuna.ical4j.model.DateTime dtStart = new DateTime(startCal.getTime());
    net.fortuna.ical4j.model.DateTime dtEnd = new DateTime(endCal.getTime());


    String eventName = bookingDate.getName();
    VEvent meeting = new VEvent(dtStart, dtEnd, eventName);

    // add timezone info..
    meeting.getProperties().add(tz.getTimeZoneId());
    String uidValue = bookingDate.getIdHash();
    meeting.getProperties().add(new Uid(uidValue));

    // Add the event and print
    icsCalendar.getComponents().add(meeting);

    CalendarOutputter outputter = new CalendarOutputter();
    outputter.output(icsCalendar, fout);

}


private Calendar createNewCalender(String filePath) throws ValidationException, IOException {

    // Saving an iCalendar file
    FileOutputStream fout = new FileOutputStream(filePath);

    Calendar calendar = new Calendar();
    calendar.getProperties().add(new ProdId("-//Ben Fortuna//iCal4j 1.0//EN"));
    calendar.getProperties().add(Version.VERSION_2_0);
    calendar.getProperties().add(CalScale.GREGORIAN);

    return calendar;
}

有人能帮我吗。

我认为问题不在于文件创建,而在于如何加载文件。对于这个错误,我建议检查文件权限以确保您能够阅读它。还要检查文件路径是否正确。但比我预期的要多:FileInputStream fin=newfileinputstream(pathMandatoryFile);是否完全为空?可能是的,但我想不出为什么文件流会过早结束。。也许如果你能显示加载文件的代码?我已经共享了代码,或者你是什么意思?这导致了问题:FileInputStream fin=新FileInputStream(pathMandatoryFile);CalendarBuilder=新的CalendarBuilder();icscendar=builder.build(fin);好的,所以很难说输入文件是什么时候创建的,但是如果您是用另一种方法创建的,我建议您没有正确地关闭流,并且会出现这个错误