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