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-formatted 文件。如果您在以下文本文件上运行cdbmake(或cdb.makesg-cdb 中包含的实用程序),您将获得相同的结果:

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

最后一点:创建Cdb类的新实例总是成功的(即使文件不存在),因为拥有一个没有键的文件是完全有效的。使用不存在的文件初始化的Cdb实例(如您在示例中所做的那样)将正确返回 null 以响应每次find()调用。 Cdb.enumerate(...)虽然并不那么宽容,并且希望获得有效 CDB 文件的路径,这就是为什么您会收到 IllegalArgumentException。

如果您需要任何其他信息,请告诉我!

于 2013-04-24T03:17:21.627 回答