0

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

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

4

1 回答 1

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

该 Dictionary Class 不是 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 相同的格式,因此您可能也需要模拟它:)

于 2012-09-11T16:45:26.730 回答