首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >sg-cdb用于操作cdb数据库的Java库

sg-cdb用于操作cdb数据库的Java库
EN

Stack Overflow用户
提问于 2013-04-15 17:27:16
回答 1查看 1.1K关注 0票数 0

我已经从http://www.strangegizmo.com/products/sg-cdb/下载了sg-cdb Java库,并将其包含在我的项目中。我正在尝试用以下代码读取CDB数据库:

代码语言:javascript
复制
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();}
    }
}

我哪里做错了,我得到了以下异常消息:

代码语言:javascript
复制
java.lang.IllegalArgumentException: invalid cdb format
    at com.strangegizmo.cdb.Cdb$1.nextElement(Cdb.java:358)

你能提供一些使用这个库的例子吗?

谢谢。

EN

回答 1

Stack Overflow用户

发布于 2013-04-24 11:17:22

我是sg-cdb的作者,可以帮助你熟悉这个库。

示例的主要问题是,在枚举CDB文件的元素之前,必须先“制作”该文件。可移植的方法是在cdbmake/cdbdump format中生成一个文件,然后使用静态CdbMake.make(...)方法将该文件转换为常量数据库。然后,您可以使用Cdb类加载该常量数据库,并查询键、枚举值等。

sg-cdb支持另一种创建常量数据库的机制,即直接构造CdbMake类的实例,调用start(...)开始写入数据库,调用add(...)向数据库添加密钥,写完密钥后再调用finish()

下面是对您的示例的更新,它使用CdbMake.start/.add/.finish生成一个文件,然后枚举该文件:

代码语言:javascript
复制
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 (或sg-cdb附带的cdb.make实用程序),也会得到相同的结果:

代码语言:javascript
复制
+3,5:one->Hello
+3,7:two->Goodbye

最后要注意的一点是:创建Cdb类的新实例总是成功的(即使文件不存在),因为没有键的文件是完全有效的。使用不存在的文件初始化的Cdb实例(就像您在示例中所做的那样)将正确地返回null以响应每个find()调用。然而,Cdb.enumerate(...)就不那么宽宏大量了,它希望得到一个有效的CDB文件的路径,这就是为什么你会得到那个IllegalArgumentException。

如果您需要任何其他信息,请让我知道!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16011781

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档