0

http://www.strangegizmo.com/products/sg-cdb/から sg-cdb Java ライブラリをダウンロードし、プロジェクトに含めました。次のコードでCDBデータベースを読み込もうとしています:

import com.strangegizmo.cdb.Cdb;
import com.strangegizmo.cdb.CdbElement;
import java.util.Enumeration;

class Start
{ 
    public static void main(String args[])
    {
        Cdb cdbFile = null;
        try{
            cdbFile = new Cdb("basefile.cdb");
        }catch (Exception e) { e.printStackTrace(); }

        try
        {
            Enumeration em = cdbFile.elements("basefile.cdb");
            while(em.hasMoreElements())
            {
                CdbElement cdbElt = (CdbElement) em.nextElement();
            }
        }catch (Exception e) {e.printStackTrace();}
    }
}

次の例外メッセージが表示されるのは、何が間違っているのですか。

java.lang.IllegalArgumentException: invalid cdb format
    at com.strangegizmo.cdb.Cdb$1.nextElement(Cdb.java:358)

このライブラリを使用した例を教えてください。

ありがとうございました。

4

1 に答える 1

1

私は sg-cdb の作成者であり、ライブラリの使用を支援できます。

サンプルの主な問題は、ファイルの要素を列挙する前に CDB ファイルを "作成" する必要があることです。これを行う移植可能な方法は、cdbmake/cdbdump 形式でファイルを生成し、静的CdbMake.make(...)メソッドを使用してそのファイルを定数データベースに変換することです。次に、クラスを使用してその定数データベースをロードしCdb、キーをクエリしたり、値を列挙したりできます。

sg-cdb は、定数データベースを作成するための別のメカニズムをサポートしています。これは、CdbMakeクラスのインスタンスを直接構築しstart(...)、 を呼び出してデータベースへの書き込みを開始し、 を呼び出してデータベースにadd(...)キーを追加し、キーのfinish()書き込みが完了したら を呼び出します。

CdbMake.start/.add/.finish を使用してファイルを生成し、ファイルを列挙する例の更新を次に示します。

import com.strangegizmo.cdb.Cdb;
import com.strangegizmo.cdb.CdbElement;
import com.strangegizmo.cdb.CdbMake;
import java.util.Enumeration;

class Start
{ 
    public static void main(String args[])
    {
        try{
            CdbMake maker = new CdbMake();
            maker.start("basefile.cdb");
            maker.add("one".getBytes(), "Hello".getBytes());
            maker.add("two".getBytes(), "Goodbye".getBytes());
            maker.finish();
        }catch (Exception e) {e.printStackTrace();}

        try
        {
            Enumeration em = Cdb.elements("basefile.cdb");
            while(em.hasMoreElements())
            {
                CdbElement cdbElt = (CdbElement) em.nextElement();
            }
        }catch (Exception e) {e.printStackTrace();}
    }
}

elements(...)はクラスの静的メソッドであるため、データベース内のすべてをダンプするためにインスタンスCdbは必要ありません。Cdb

ただし、一般的には、形式のファイルを取り込むことをお勧めしますcdbdump。次のテキスト ファイルに対してcdbmake(またはsg-cdb に含まれているユーティリティを)実行すると、同じ結果が得られます。cdb.make

+3,5:one->Hello
+3,7:two->Goodbye

最後に 1 つ: クラスの新しいインスタンスの作成はCdb(ファイルが存在しない場合でも) 常に成功します。存在しないファイルで初期化されたインスタンス (例で行ったように) は、すべての呼び出し Cdbに応答して正しく null を返します。ただし、それほど寛容ではなく、有効なCDBファイルへのパスが与えられることを期待しているため、IllegalArgumentExceptionが発生しています。find()Cdb.enumerate(...)

追加情報が必要な場合はお知らせください。

于 2013-04-24T03:17:21.627 に答える