我已从http://code.google.com/p/quickdic-dictionary/下载了字典文件 但文件扩展名为.quickdic,不是纯文本。
如何将快速词典(.quickdic)加载到c#中以进行简单的单词查询?
答案 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相同的格式,因此您可能需要模拟它:)