`
laomie
  • 浏览: 1349 次
  • 性别: Icon_minigender_1
  • 来自: 天津
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

read stardict file

阅读更多
    private static byte[] loadFile(String file) throws IOException
    {
        // save data to binary stream
        ByteArrayOutputStream byteStream = null;
        // read file to stream
        InputStream in = null;
        // binary data which get from file
        byte[] data = null;

        try
        {
            byteStream = new ByteArrayOutputStream();
            if (mIdxFile.equals(file))
            {
                in = new BufferedInputStream(new FileInputStream(file));
            }
            else
            {
                in = new GZIPInputStream(new FileInputStream(file));
            }
            byte[] buf = new byte[1024];
            int numRead = 0;
            while((numRead = in.read(buf)) != -1)
            {
                byteStream.write(buf, 0, numRead);
            }
            data = byteStream.toByteArray();
        }
        finally
        {
            in.close();
            byteStream.close();
        }

        return data;

    }

    /*
     * index file structure
     * word + '\0' (1 byte) + data offset in dict file (4 bytes) + data size in dict file (4 bytes)
     *
     * */
    private static List<StarDictWord> loadDictIndex() throws IOException
    {
        List<StarDictWord> words = new ArrayList<StarDictWord>();
        byte[] splitByte = SPLIT_CHAR.getBytes();
        int currentIndex = 0;
        int dataIndex = 0;
        byte[] data = loadFile(mIdxFile);
        int dataLength = data.length;

        while (currentIndex < dataLength)
        {
            // search for '\0'
            if (data[currentIndex] == splitByte[0])
            {
                // 4 bytes for data offset and 4 bytes for data size in dict file
                if (currentIndex + 8 < dataLength)
                {
                    // data size in index file
                    int dataSize = currentIndex - dataIndex;
                    StarDictWord word = new StarDictWord();
                    byte[] wordData = new byte[dataSize];
                    for (int i = 0; i < dataSize; i++)
                    {
                        wordData[i] = data[i + dataIndex];
                    }

                    byte[] dataOffsetByte = new byte[4];
                    byte[] dataSizeByte = new byte[4];
                    for (int i = 1; i < 4; i++)
                    {
                        dataOffsetByte[i] = data[currentIndex + i + 1];
                        dataSizeByte[i] = data[currentIndex + i + 5];
                    }

                    try
                    {
                        String content = new String(wordData, "utf-8");
                        word.setContent(content);
                        word.setDictName(mDictName);
                        word.setDictFileOffset(ByteBuffer.wrap(dataOffsetByte).getInt());
                        word.setDictFileSize(ByteBuffer.wrap(dataSizeByte).getInt());
                        words.add(word);
                    }
                    catch (Exception e)
                    {
                        logger.severe("error in " + dataIndex);
                    }
                }
                currentIndex += 8;
                // reset data index
                dataIndex = currentIndex + 1;
            }

            currentIndex += 1;
        }

        return words;
    }

    private static void loadDictData(List<StarDictWord> words) throws IOException
    {
        // skip for empty list
        if (words.size() == 0)
        {
            return;
        }

        byte[] data = loadFile(mDictFile);
        int dataLength = data.length;
        int offset = 0;
        int size = 0;

        for(StarDictWord word : words)
        {
            offset = word.getDictFileOffset();
            size = word.getDictFileSize();
            if (offset + size - 1 < dataLength)
            {
                byte[] wordData = new byte[size];
                for (int i = 0; i < size; i++)
                {
                    wordData[i] = data[i + offset];
                }
                loadWordData(word, wordData);
            }

        }
    }
分享到:
评论

相关推荐

    星际译王-stardict

    包括:stardict-cdict-gb-2.4.2.tar.bz2,stardict-kdic-computer-gb-2.4.2.tar.bz2,stardict-kdic-ec-11w-2.4.2.tar.bz2,stardict-oxford-gb-2.4.2.tar.bz2,stardict-xdict-ce-gb-2.4.2.tar.bz2,stardict-sun_...

    常用stardict字典

    《常用stardict字典详解》 在信息技术领域,词汇量的积累对于学习和工作至关重要。stardict,作为一款开源、跨平台的词典软件,因其高效、便捷的特性,受到了众多用户的喜爱。本文将深入探讨stardict及其常用的词典...

    StarDict星际译王词库-Stardict/郎道英汉

    StarDict星际译王是一款强大的多语种词典软件,它以其高效、开源和全面的特点深受广大用户喜爱。这款软件提供了丰富的词库支持,包括不同领域的专业词汇,使得学习者和专业人士能够快速查找和理解各种词汇的含义。在...

    stardict 词典资源

    《stardict 词典资源详解与应用指南》 Stardict 是一款开源、免费的多平台词典软件,以其高效、便捷的查词功能深受用户喜爱。它支持多种语言的词典,允许用户自定义词典库,极大地扩展了其使用范围。本篇文章将深入...

    stardict的牛津辞典安装包

    在Linux操作系统中,Stardict是一款非常受欢迎的免费开源词典软件,它提供了丰富的词典资源和高效快捷的查询功能。本篇将详细讲解如何安装和使用"stardict的牛津辞典安装包",以及相关的重要知识点。 首先,我们要...

    stardict 3.0

    《星际译王(Stardict)3.0 for Windows:高效便捷的多语种词典软件》 星际译王(Stardict)是一款开源、免费的多语种词典软件,以其强大的功能和用户友好的界面深受全球用户的喜爱。本文将深入探讨其最新版本——...

    stardict词库

    stardict词库

    stardict词库.7z

    《stardict词库:开启英汉互译与牛津大辞典的高效学习之路》 stardict,一个开源的、跨平台的词典软件,因其强大的功能和丰富的词库资源,在全球范围内广受用户喜爱。这个名为“stardict词库.7z”的压缩包,便是为...

    stardict-3.03 source code

    stardict-3.03 source code

    StarDict星际译王的安装离线词典和语音库

    ubuntu下安装stardict(星际译王): sudo apt install stardict sudo apt install stardict-gtk 然后下载解压本zip包,再将其中各个bz2文件解压放置到适当共享路径上: tar -jxf stardict-xxx.tar.bz2 sudo mv ...

    Stardict词库

    1:sudo apt-get install stardict 2:全部解压到temp文件夹中 3:sudo mv temp/* /usr/share/stardict/dic 3:重启星际译王 包含的词库zh_CN 简体中文词典.html中所有汉语+英汉词库 cdict-gb dictionary(en - zh_...

    stardict词典

    stardict词典 stardict-21shijishuangxiangcidian-2.4.2.tar.bz2

    stardict 词库

    stardict 词库stardict-ProECCE-2.4.2/ stardict-langdao-ce-gb-2.4.2/ stardict-langdao-ec-gb-2.4.2/ stardict-lazyworm-ce-2.4.2/ stardict-lazyworm-ec-2.4.2/ stardict-oxford-gb-formated-2.4.2/ stardict-...

    stardict字典-汉英

    星际译王(Stardict)是一款开源的、跨平台的词典软件,因其高效、功能丰富和用户友好而广受欢迎。这款字典软件支持多种语言的互译,其中包括汉英词典。在提供的压缩包“stardict-langdao-ce-gb-2[1].4.2”中,包含...

    星际译王Stardict词库

    星际译王Stardict词库星际译王Stardict词库星际译王Stardict词库

    stardict dict.zip

    《stardict dict.zip》是一款集成了多种语言资源的压缩包,主要面向英语与汉语的学习者,特别适合在Linux系统中使用。其中包含了多种类型的词典,如朗文词典、21世纪英汉双解词典以及汉语成语词典等,提供了丰富的...

    stardict for linux

    《StarDict for Linux:一款强大的开源词典软件》 在Linux操作系统中,寻找一款功能强大、易用且完全免费的词典软件并非易事,但StarDict无疑满足了这一需求。StarDict是一款专为Linux设计的开源词典软件,以其丰富...

    stardict字典-oxford

    星际译王(Stardict)是一款开源的、跨平台的词典软件,因其高效、功能强大而受到广大用户的喜爱。标题中的"stardict字典-oxford"指的是这款软件中的一款词典资源,即牛津词典。牛津词典是世界上最权威的英语词典之...

Global site tag (gtag.js) - Google Analytics