1

我非常喜欢使用 apache-digester 将 XML 文件加载到我的对象模型中。

我正在处理包含许多重复项(事件日志)的大文件,因此想要 String.intern() 特定属性(经常重复的属性)的字符串。

由于 Apache-Digester 在放弃控制之前读取整个文件,它最初会生成大量重复文件,从而占用大量内存;然后我可以去迭代我所有的对象和实习生,但我仍然要付出用完大量内存的代价。

另一种选择是让我的对象模型中的相应 setProperty bean 函数始终实习参数,但我在我的代码中对已经实习的字符串使用相同的函数,这样会很浪费;此外,我不想在我的模型中引入消化器特定的代码。

有没有办法让 Digester 在设置属性之前/之后实习或执行自定义代码?

4

1 回答 1

3

您可以创建自己的 Digester Rule 来完成此操作:

public class InternRule extends BeanPropertySetterRule
{
    public InternRule( String propertyName )
    {
        super( propertyName );
    }

    @Override
    public void body( String namespace, String name, String text )
        throws Exception
    {
        super.body( namespace, name, text.intern() );
    }

}

而不是这样做:

digester.addBeanPropertySetter( "book/author", "author" );

你会这样做:

digester.addRule( "book/author", new InternRule( "author" ) );

根据您使用的消化器方法,您可以子类化不同的类(SetPropertyRule、CallMethodRule 等)

于 2009-06-08T23:33:16.850 回答