1

私は apache-digester を使用して XML ファイルをオブジェクト モデルにロードするのが大好きです。

多くの重複 (イベント ログ) を含む大きなファイルを扱っているため、特定の属性 (頻繁に繰り返されるもの) の文字列を String.intern() したいと考えています。

Apache-Digester は制御を放棄する前にファイル全体を読み取るため、最初は大量の重複を生成し、大量のメモリを消費します。その後、すべてのオブジェクトとインターンを反復処理できますが、それでも大量のメモリを使用するというコストがかかります。

もう 1 つの方法は、オブジェクト モデル内の対応する setProperty Bean 関数を常にパラメーターをインターンすることですが、既にインターンされている文字列に対してコード内から同じ関数を使用するため、無駄になります。その上、ダイジェスター固有のコードをモデルに導入したくありません。

プロパティを設定する前後に Digester をインターンまたはカスタム コードを実行させる方法はありますか?

4

1 に答える 1

3

これを実現するために、独自の Digester ルールを作成できます。

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 に答える