2013-04-15 2 views
0

sg-cdb Java 라이브러리를 http://www.strangegizmo.com/products/sg-cdb/에서 다운로드하여 프로젝트에 포함 시켰습니다. 나는 다음과 같은 코드로 CDB 데이터베이스를 읽으려고 해요 :sg-cdb cdb 데이터베이스 작업을위한 Java 라이브러리

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()으로 전화하십시오. elements(...)Cdb에 정적 메서드는

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();} 
    } 
} 

하는 것으로 다음과 같습니다

는 파일을 생성 한 다음 파일을 통해 열거 할 CdbMake.start/.add/.finish를 사용하여 예 업데이트입니다 따라서 데이터베이스의 모든 것을 덤프하려면 Cdb 인스턴스가 필요하지 않습니다.

일반적으로 내 추천은 cdbdump 형식의 파일을 섭취하는 것입니다.

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

마지막으로 참고 : 다음과 같은 텍스트 파일에 cdbmake (또는 SG-CDB에 포함 된 cdb.make 유틸리티)를 실행할 경우 동일한 결과를 얻을 것 Cdb 클래스는 항상 성공의 새로운 인스턴스를 생성 (파일이 없더라도) 키가없는 파일을 가지고 있기 때문에 완벽하게 유효합니다. 존재하지 않는 파일로 초기화 된 Cdb 인스턴스는 모든 find() 호출에 대한 응답으로 null을 올바르게 반환합니다. Cdb.enumerate(...)은 용서가되지 않지만 유효한 CDB 파일의 경로가 주어지기를 기대합니다. 그 때문에 IllegalArgumentException이 발생합니다.

추가 정보가 필요하면 알려주세요.

+0

안녕 마이클, 아직 작동하지 않습니다. 동일한 예외가 발생합니다. 다른 도구가 동일한 파일을 읽을 수 있지만 외부 cdb 파일을 읽으려고하고 api가 "잘못된 cdb 형식"이라고 말합니다. –

관련 문제