質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.34%

  • Android

    6720questions

    Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

  • Android Studio

    3886questions

    Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Androidでテキストファイルを読み込もうとすると「too large」と表示されてしまい読み込めない

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 499

ehyai

score 33

前提・実現したいこと

Android Studioで、テキストファイルを読み込む動作をするアプリケーションを作りたいと考えています。
こちらのサイトを参考にして、(プロジェクト名)/app/src/main/assetsフォルダの中にテキストファイルを格納し、そのテキストファイルを読み込むアプリケーションを作りました。テキストデータの容量が少ないテキストファイルであれば、無事に読み込むことができました。

発生している問題・エラーメッセージ

しかし、私は20000KB以上もの大きな容量のテキストファイルを読み込みたいと考えておりまして、そのようなテキストファイルを読み込もうとしたら、反応しないままアプリケーションが固まってしまいます。そして、

(アプリケーション名)isn't responding


と表示されます。そこで選択肢の「Wait」を押しても、また固まった状態になってしまいます。
テキストファイルをダブルクリックするとその中身がAndroid Studio上で見ることができるのですが、この大きな容量のテキストファイルの場合、

File C:/(~プロジェクトまでのパス)/app/src/main/assets/(テキストファイル) is too large


と表示され、見ることができなくなっています。
そこで、容量の大きなテキストファイルでも読み込むことのできるような方法について、何かアドバイスなどをいただけたらと思います。
よろしくお願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • coco_bauer

    2017/09/01 11:18

    20MB(2000万バイト)ものファイル(全角で1000万文字、56日分の朝日新聞の朝刊の全記事の文字数相当)を読み込んで、何をするのですか? 適切な読み込み方は、読み込んだデータの使い方によって違いますよ。

    キャンセル

  • ehyai

    2017/09/01 13:44

    指摘してくださってありがとうございます。このテキストファイルには辞書のデータが入っており、状況に応じて指定された単語の意味を表示出来るようにしたいと考えています。

    キャンセル

回答 3

checkベストアンサー

+1

テキストファイルは辞書だという事なので、辞書(Dictionary)オブジェクトにテキストファイルの内容を入れるのが適切ではないかと思います。

ファイルを読み込んで辞書オブジェクトを作るまでのコードは以下のような感じ

  jisho = dictionary();  //辞書の変数を作る

  is = this.getAssets().open(テキストファイル);
  br = new BufferedReader(new InputStreamReader(is));

  // 1行ずつ読み込み、改行を付加する
  String str;
  while ((str = br.readLine()) != null) {
     separatorPos = str.indexof(":");  // 見出し語(単語)と意味が、コロンで区切られていると仮定。(必要に応じて、: を実際に使われている区切りに変更してください)
     jisho.put(str.substring(1,separatorPos-1),str.substring(separatorPos+1)); // 見出し語と意味のペアを辞書に追加。
  }

この辞書を使って、assetという語の意味を表示するコードは以下のようになります。
(テキストファイルにassetのデータが入っていることを前提)

  String result;
  result = jisho.get("asset");  // 変数resultに、assetの意味が入る

dictionaryクラスの詳しい説明は、java.util.Dictionary<K,V>クラスを参照してください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/01 17:07

    回答してくださってありがとうございます。
    辞書オブジェクトに関して丁寧に教えてくださってありがとうございます。一つ質問させていただきたいのですが、coco_bauerさんの提示してくださった手法のうち、 「separatorPos = str.indexof(":");(見出しとコロンで区切る)」ところは、必ず二つにしか区切ることができないのでしょうか。区切りの記号を増やして三つや四つに増やすことは可能でしょうか。

    キャンセル

  • 2017/09/04 17:48

    具体例のコードまで細かく教えてもらえたということで、今回ベストアンサーに選ばせていただきました。
    ありがとうございました。

    キャンセル

+1

テキストファイルの内容をまるごと一つの変数に読み込むのではなく、

  1. 1行読み込む
  2. 何か必要な処理をする
  3. 読んだものは捨てる
  4. 最初に戻る

こういうふうに作ることです。2をどう作るかは、そのプログラムで何をどうしたいかによるでしょうが、いずれにせよサンプルプログラムのこの辺

while ((str = br.readLine()) != null) {
            text += str + "\n";
        }


を書き換えることになるでしょうね。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/01 13:14

    回答してくださってありがとうございます。
    試しにtextにstrの変数の部分を加えていくコードではなく、単にテキストの行の数を数えるコードに書き換えてみました(text += str + "\n";の箇所を変更、それ以外の箇所は変更していない)が、正しく動作しました。
    この結果を見る限り、~is too largeと書かれているのは単にAndroid Studio上で確認できないだけで実際の動作そのものは問題ないと思われます。
    ただ、KojiDoiさんのおっしゃる通り、変数に変数を加え続けていくコードは重くなってしまい、そのために止まってしまったのは間違いなさそうなので、コードの書き換えは必要になってくると思います。

    キャンセル

+1

AndroidではUIスレッドと呼ばれるViewが描画されるスレッドで重い処理を行うことはできません。
今回のように巨大なファイルを読み込みたい場合は別のスレッドをつくってそこで読み込みの処理を行う必要があります。
面倒くさいのでサンプルコードは載せませんがAsyncTaskとかHandlerとかでしらべてみるといいでしょう

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/01 13:41

    回答してくださってありがとうございます。
    AsyncTask、Handlerは初めて知った単語ですね...
    まだ詳しくは理解できていないのですが、別のスレッドで処理を行わせることで大きなファイルの読み込みなどの重い処理も実現させられるかもしれないということで合っていますでしょうか。

    キャンセル

  • 2017/09/01 14:27

    そうですね。ただ大量の文字をすべて変数で持つのはメモリの無駄遣いでしかないので、画面に表示する分だけ読んできて、ユーザーのスクロールに合わせて再度読み込むと言った風にした方がいいかもしれません

    キャンセル

  • 2017/09/01 17:03

    ありがとうございます。
    文字全てを変数で持つやり方は変えるようにしたいと思います。
    私が作成しようとしているアプリケーションは辞書機能を持つものであり、そのため文字の中から知りたい単語に関する情報だけを変数で持つことで、表示する量を減らそうと思います。それでも時間がかかりすぎるなど厳しいと感じた場合は、youta1119さんのおっしゃるように、ユーザーのスクロールに合わせて再度読み込む手法も考えたいと思います。

    キャンセル

  • 2017/09/01 17:23

    辞書的なものならデータベースを活用した方が良いですね

    キャンセル

  • 2017/09/03 02:50

    またも回答ありがとうございます。
    現在、私の辞書機能を持つアプリケーションはメモ帳で作成されたテキストファイルに書かれた辞書データを読み込むというものなのですが、そのデータをMySQLなどのデータベースに移したりということは難しいでしょうか。
    また一から作り直すといったことが必要になってきますでしょうか。

    キャンセル

同じタグがついた質問を見る

  • Android

    6720questions

    Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

  • Android Studio

    3886questions

    Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。