Java平面文件解析器(jffp)LineFormatTest

Java平面文件解析器(jffp)LineFormatTest,java,Java,我想使用Java平面文件解析器(jffp),并尝试运行TestCase(JUnit)“LineFormatTest”,它位于src文件中(在文件“test”中单击一些之后)。 我得到的是这个错误: org.sadun.text.ffp.FieldDefinitionException:编程错误: 字段字段_1_1(从位置0到位置5,长度5,类型 数字)和字段_1_1(从位置0到位置5,长度5,类型 数字)相交 有人试过运行这个测试用例,但也遇到了这个错误吗?我在jffp和JDK1.7方面遇到了很

我想使用Java平面文件解析器(jffp),并尝试运行TestCase(JUnit)“LineFormatTest”,它位于src文件中(在文件“test”中单击一些之后)。 我得到的是这个错误:

org.sadun.text.ffp.FieldDefinitionException:编程错误: 字段字段_1_1(从位置0到位置5,长度5,类型 数字)和字段_1_1(从位置0到位置5,长度5,类型 数字)相交


有人试过运行这个测试用例,但也遇到了这个错误吗?

我在jffp和JDK1.7方面遇到了很多麻烦。我调查了源代码,发现oracle修改了JDK1.7中TreeSet中使用的TreeMap的bit实现,因此,jffp将字段定义添加到集合中,但map的新实现为第一个元素调用compare方法,并且jffp中实现的比较器包含对字段元素位置的检查,如果位置相同,则抛出“编程异常”。如果您查看异常描述,就会发现它比较了同一个字段


因此,如果您也使用jdk1.7,那么我认为没有任何light way解决方案可以摆脱jffp或jdk1.7(回到1.6)。

我只是在使用jdk1.7.055和jffp时遇到了这个错误。 在Java7中,一旦第一个元素添加到树集合中,就会调用比较器。因此,将第一个FieldInfo实例(o1)与自身(o2)进行比较;o1和o2明显相交

以下是我已成功测试的快速且肮脏的解决方案:

  • 在sourceforge下载jffp的源代码:

  • 获取LineFormat.java文件,并将其复制到项目中的org.sadun.text.ffp包中

  • 现在修改addFieldInfo私有方法 并将一个(f1!=f2)条件添加到f1。相交(f2)测试以确保字段不会针对其自身进行相交测试:

     private void addFieldInfo(int physicalLine, FieldInfo info) {
           if (physicalLine > currentPhysicalLine)
              currentPhysicalLine = physicalLine;
           final Integer pl = new Integer(physicalLine);
           SortedSet l = (SortedSet) fieldsByLine.get(pl);
           if (l == null) {
              l = new TreeSet(new Comparator() {
                 public int compare(Object o1, Object o2) {
                    FieldInfo f1 = (FieldInfo) o1;
                    FieldInfo f2 = (FieldInfo) o2;
                    // fields must not intersect
                    if ((f1 != f2)
                          && f1.intersects(f2))
                       throw new FieldDefinitionException(
                             "Programming error: the fields "
                                   + f1
                                   + " and "
                                   + f2
                                   + " intersect");
                    return f1.start - f2.start;
    
                 }
              });
              fieldsByLine.put(pl, l);
           }
           l.add(info);
     }
    
  • 编译和测试


  • 我要联系开发商。也许他可以建立一个官方版本来修复这个bug。

    谢谢@salvezza。你为我节省了很多时间。您对其他与Java1.7兼容的fixedformat解析器有什么建议吗?没有,但这里有一些建议。谢谢@salvezza,您是否找到了通过修改jffp源代码来修复它的方法?