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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Android

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

Android Studio

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

Q&A

解決済

3回答

3079閲覧

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

ehyai

総合スコア43

Android

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

Android Studio

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

0グッド

2クリップ

投稿2017/08/31 09:23

###前提・実現したいこと
Android Studioで、テキストファイルを読み込む動作をするアプリケーションを作りたいと考えています。
こちらのサイトを参考にして、(プロジェクト名)/app/src/main/assetsフォルダの中にテキストファイルを格納し、そのテキストファイルを読み込むアプリケーションを作りました。テキストデータの容量が少ないテキストファイルであれば、無事に読み込むことができました。
###発生している問題・エラーメッセージ
しかし、私は20000KB以上もの大きな容量のテキストファイルを読み込みたいと考えておりまして、そのようなテキストファイルを読み込もうとしたら、反応しないままアプリケーションが固まってしまいます。そして、

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

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

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

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

coco_bauer

2017/09/01 02:18

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

2017/09/01 04:44

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

回答3

0

ベストアンサー

テキストファイルは辞書だという事なので、辞書(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 07:01

coco_bauer

総合スコア6915

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ehyai

2017/09/01 08:07

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

2017/09/04 08:48

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

0

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

投稿2017/08/31 14:43

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ehyai

2017/09/01 04:41

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

退会済みユーザー

2017/09/01 05:27

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

2017/09/01 08:03

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

退会済みユーザー

2017/09/01 08:23

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

2017/09/02 17:50

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

0

テキストファイルの内容をまるごと一つの変数に読み込むのではなく、
0. 1行読み込む
0. 何か必要な処理をする
0. 読んだものは捨てる
0. 最初に戻る

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

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

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

投稿2017/08/31 10:38

KojiDoi

総合スコア13671

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ehyai

2017/09/01 04:14

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問