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.

Дайте мне знать, если вам нужна дополнительная информация!

Другие вопросы по тегам