如何将快速字典加载到C#

时间:2012-09-11 15:15:30

标签: c# database dictionary

我已从http://code.google.com/p/quickdic-dictionary/下载了字典文件 但文件扩展名为.quickdic,不是纯文本。

如何将快速词典(.quickdic)加载到c#中以进行简单的单词查询?

1 个答案:

答案 0 :(得分:4)

我浏览了git代码,并且发现了一些问题。

首先,在DictionaryActivity.java文件中,onCreate()中有以下内容:

    final String name = application.getDictionaryName(dictFile.getName());
    this.setTitle("QuickDic: " + name);
    dictRaf = new RandomAccessFile(dictFile, "r");
    dictionary = new Dictionary(dictRaf);

那个字典类不是带Java的内置类,而是根据导入:

    import com.hughes.android.dictionary.engine.Dictionary;

当我在那里看时,它显示了一个以RandomAccessFile为参数的Dictionary的构造函数。这是源代码:

public Dictionary(final RandomAccessFile raf) throws IOException {
dictFileVersion = raf.readInt();
if (dictFileVersion < 0 || dictFileVersion > CURRENT_DICT_VERSION) {
  throw new IOException("Invalid dictionary version: " + dictFileVersion);
}
creationMillis = raf.readLong();
dictInfo = raf.readUTF();

// Load the sources, then seek past them, because reading them later disrupts the offset.
try {
  final RAFList<EntrySource> rafSources = RAFList.create(raf, new EntrySource.Serializer(this), raf.getFilePointer());
  sources = new ArrayList<EntrySource>(rafSources);
  raf.seek(rafSources.getEndOffset());

  pairEntries = CachingList.create(RAFList.create(raf, new PairEntry.Serializer(this), raf.getFilePointer()), CACHE_SIZE);
  textEntries = CachingList.create(RAFList.create(raf, new TextEntry.Serializer(this), raf.getFilePointer()), CACHE_SIZE);
  if (dictFileVersion >= 5) {
    htmlEntries = CachingList.create(RAFList.create(raf, new HtmlEntry.Serializer(this), raf.getFilePointer()), CACHE_SIZE);
  } else {
    htmlEntries = Collections.emptyList();
  }
  indices = CachingList.createFullyCached(RAFList.create(raf, indexSerializer, raf.getFilePointer()));
} catch (RuntimeException e) {
  final IOException ioe = new IOException("RuntimeException loading dictionary");
  ioe.initCause(e);
  throw ioe;
}
final String end = raf.readUTF(); 
if (!end.equals(END_OF_DICTIONARY)) {
  throw new IOException("Dictionary seems corrupt: " + end);
}

所以,无论如何,这就是他的java代码读取文件的方式。

希望这可以帮助您在C#中进行模拟。

从这里你可能想看看他是如何序列化EntrySource,PairEntry,TextEntry和HtmlEntry,以及indexSerializer。

接下来看看RAFList.create()是如何工作的。

然后看看如何使用CachingList.create()

将结果合并到创建CachingList中

免责声明:我不确定C#中的内置序列化程序是否使用与Java相同的格式,因此您可能需要模拟它:)