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

时间:2012-12-04 06:33:21

标签: java

我想使用Java Flat File Parser(jffp)并尝试运行TestCase(JUnit)" LineFormatTest"它位于src文件中(在文件内部点击后#34;测试")。 我得到的是这个错误:

  

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

是否有人试图运行此TestCase并偶然发现此错误?

2 个答案:

答案 0 :(得分:3)

我在使用jffp和JDK1.7时遇到了麻烦。我调查了源代码并发现oracle对在JDK1.7中的TreeSet中使用的TreeMap的一些实现进行了修正,因此jffp将字段定义添加到集合中,但是地图调用的新实现比较了第一个元素与其自身的比较方法以及在jffp包含对field元素位置的检查,如果位置相同则抛出“编程异常”。如果您查看异常描述,您会看到它比较了相同的字段。

所以,如果你也使用jdk1.7那么我没有看到任何轻松的解决方案,因为摆脱jffp或jdk1.7(回到1.6)。

答案 1 :(得分:2)

我刚刚在使用jdk1.7.0_55和jffp时遇到了这个错误。 在Java 7中,只要将第一个元素添加到TreeSet,就会调用比较器。所以将第一个FieldInfo实例(o1)与自身进行比较(o2); o1和o2明显相交。

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

  1. 在sourceforge下载 jffp 源代码:http://sourceforge.net/projects/jffp/

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

  3. 现在修改 addFieldInfo 私有方法 并在 f1.intersects(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);
     }
    
  4. 编译和测试。

  5. 我打算联系开发者。也许他可以建立一个正式版来修复这个bug。