1

テキスト ファイルから単語を読み取る辞書アプリに取り組んでいますが、テキスト ファイルのサイズが 10 MB であるため、メモリの制限により、エミュレーターまたはデバイスで実行できません。

では、この問題の解決策は何ですか? 圧縮されているテキスト ファイルを zip から読み取ることはできますか、それとも 10 個の個別のテキスト ファイルにそれぞれ 1 MB ずつ分割する方がよいでしょうか?

以下は、テキスト ファイルを読み取るための現在のコードです。コードにどのような変更を加える必要がありますか?

private synchronized void loadWords(Resources resources) throws IOException {
        if (mLoaded) return;

        Log.d("dict", "loading words");
        InputStream inputStream = resources.openRawResource(R.raw.definitions);
        BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));

        try {
            String line;
            while((line = reader.readLine()) != null) {
                String[] strings = TextUtils.split(line, ":");
                if (strings.length < 2) continue;
                addWord(strings[0].trim(), strings[1].trim());
            }
        } finally {
            reader.close();
        }
        mLoaded = true;
    }

public synchronized List<Word> getAllMatches(Resources resources) throws IOException {
        List<Word> list = new ArrayList<Word>();
        InputStream inputStream = resources.openRawResource(R.raw.definitions);
        BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));

        try {
            String line;
            while((line = reader.readLine()) != null) {
                String[] strings = TextUtils.split(line, ":");
                if (strings.length < 2) continue;
                Word word = new Word(strings[0].trim(), strings[1].trim());
                list.add(word);
            }
        } finally {
            reader.close();
        }

        return list;
    }
4

1 に答える 1

0

gzip単一ファイル圧縮 ("big-text.txt.gz") を使用し、GZipInputStream を使用できます。

同じ文字列を一度メモリに保持する必要があります。必要に応じて、文字列を渡す前に検索できます。

Map<String, String> sharedStrings = new HashMap<>();

String share(String s) {
    String sToo = sharedStrings.get(s);
    if (sToo == null) {
        sToo = s;
        sharedStrings.put(s, s);
    }
    return sToo;
}

データベースを使用するという提案も良いものです。

于 2013-02-28T11:57:56.923 に答える