sg-cdb Java библиотека для работы с базой данных cdb
Я скачал библиотеку Java sg-cdb с http://www.strangegizmo.com/products/sg-cdb/ и включил ее в свой проект. Я пытаюсь прочитать базу данных 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)
Можете ли вы привести пример работы с этой библиотекой?
Спасибо.
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
(или cdb.make
Утилита, включенная в sg-cdb) в следующем текстовом файле:
+3,5:one->Hello
+3,7:two->Goodbye
Последнее замечание: создание нового экземпляра Cdb
Класс всегда успешен (даже если файл не существует), потому что вполне допустимо иметь файл без ключей. Cdb
экземпляр, инициализированный несуществующим файлом (как вы сделали в вашем примере), будет правильно возвращать ноль в ответ на каждый find()
вызов. Cdb.enumerate(...)
хотя и не так прост, и ожидает, что ему будет предоставлен путь к действительному файлу CDB, поэтому вы получаете исключение IllegalArgumentException.
Дайте мне знать, если вам нужна дополнительная информация!