我从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)
您能提供使用此库的任何示例吗?
谢谢。
答案 0 :(得分:1)
我是sg-cdb的作者,可以帮助您使用该库。
您的示例的主要问题是您必须先“制作”CDB文件,然后才能枚举文件的元素。可移植的方法是在cdbmake/cdbdump format中生成一个文件,然后使用静态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
最后要注意的是:创建Cdb
类的新实例总是成功(即使该文件不存在),因为拥有一个没有键的文件是完全有效的。使用不存在的文件初始化的Cdb
实例(正如您在示例中所做的那样)将正确返回null以响应每个find()
调用。 Cdb.enumerate(...)
并不是那么宽容,并期望获得有效CDB文件的路径,这就是你得到IllegalArgumentException的原因。
如果您需要任何其他信息,请与我们联系!