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

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

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

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

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

Q&A

解決済

2回答

752閲覧

複数ファイルの一括データ読み込みで配列がnullになる

3mp

総合スコア5

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

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

0グッド

0クリップ

投稿2020/04/01 14:45

編集2020/04/02 05:21

###実現したいこと
Androidアプリでローカルのとあるフォルダの全ファイルのデータを読み出し、Fragmentで指定したファイルのデータを取得してグラフを描く。(MPAndroidChart使用)

###該当のソースコード

java

1public class ReadData { 2 private String path = パス; 3 private File file; 4 private File[] fileList; 5 private File dataFile; 6 7 private int numFiles; 8 9 private float[][] array1; 10 private float[][] array2; 11 private float[][] array3; 12 13 public void readDataFile(Context context) { 14 String text; 15 fileAccess(); 16 17 for(int i = 0; i < numFiles; i++){ 18 int j = 0; 19 dataFile = fileList[i]; 20 //ファイル名取得 21 String fileName = dataFile.getName(); 22 23 try{ 24 FileInputStream fileInputStream = context.openFileInput(fileName); 25 BufferedReader reader = new BufferedReader(new InputStreamReader(fileInputStream,"UTF-8")); 26 27 String lineBuffer; 28 29 while ((lineBuffer = reader.readLine()) != null){ 30 text = lineBuffer; 31 String[] data = text.split(",", -1); 32 33 array1[i][j] = Float.parseFloat(data[0]); 34 array2[i][j] = Float.parseFloat(data[1]); 35 array3[i][j] = Float.parseFloat(data[2]); 36 37 j++; 38 } 39 fileInputStream.close(); 40 reader.close(); 41 } catch (IOException e) { 42 e.printStackTrace(); 43 } 44 } 45 } 46 47 public void fileAccess(){ 48 file = new File(path); 49 fileList = file.listFiles(); 50 numFiles = fileList.length; 51 } 52 53 public int getNumFiles() { 54 return numFiles; 55 } 56 57 public File[] getFileList() { 58 return fileList; 59 } 60 61 public float[][] getArray1() { 62 return array1; 63 } 64 65 public float[][] getArray2() { 66 return array2; 67 } 68 69 public float[][] getArray3() { 70 return array3; 71 } 72} 73

java

1public class GraphFragment extends Fragment { 2 private DataViewModel dataViewModel; 3 private ReadData readData; 4 5//省略 6 7 @Override 8 public void onViewCreated(View root, Bundle bundle){ 9 dataViewModel = ViewModelProviders.of(getActivity()).get(dataViewModel.class); 10 11 mChart = root.findViewById(R.id.line_chart); 12 13 setUpLineChart(); 14 15 //別画面で選択したファイルがfile.listFiles()の何個目かわたす。 16 final Observer<Integer> observer = new Observer<Integer>() { 17 @Override 18 public void onChanged(Integer integer) { 19 setData(integer); 20 } 21 }; 22 dataViewModel.getItemNumber().observe(getViewLifecycleOwner(), observer); 23 } 24 25 private void setData(int i){ 26 readData = new ReadData(); 27 readData.readDataFile(getContext()); 28 float[][] data = readData.getArray2(); 29 30 ArrayList<Entry> values = new ArrayList<>(); 31 32 for(int j = 0; j < data[i].length; j++){ 33 values.add(new Entry(j, data[i][j], null, null)); 34 } 35 36//省略

Fragmentの方、全て載せると長いのでデータセットに関する部分のみ抜粋しました。

###発生している問題
データの格納の仕方が悪いのか、Fragmentでの配列の要素の取得がわるいのかわかりませんが、data[i][j]がnullになってしまいます。nullになってしまう原因、対処がわからないので教えていただきたいです。

Android StudioのLogCatのエラーを確認したところ、setDataのfor文の中のdata配列で
java.lang.NullPointerException: Attempt to read from null array
と出ていました。

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

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

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

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

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

3mp

2020/04/01 15:31 編集

ご指摘ありがとうございます。 float[][] array1 = new float[20][100] のように適当な要素数で初期化してみましたが、データが格納されずにすべて0がはいってしまっていました
hoshi-takanori

2020/04/01 15:36 編集

ファイルはどこに置いてますか? また、適切なパーミッションを設定していますか?
3mp

2020/04/01 15:42

ファイルは外部ストレージのAndroid/data/にあるアプリのフォルダです。 パーミッションはREAD_EXTERNAL_STORAGE, WRITE_EXTERNAL_STORAGEを設定しています。 また、別画面でReadDataクラスのfileAccessメソッドを用いてrecyclerViewでファイルの一覧を表示しているのですが、そこは問題なく実装できています。
hoshi-takanori

2020/04/01 15:53

dataFile.getName() でファイル名だけにして context.openFileInput() してるからでは。dataFile にフルパスが入ってるのでそれを直接開けばいい気がします。あと、LogCat のエラーを確認しましょう。
3mp

2020/04/01 16:06

ありがとうございます。LogCatのエラーを解読してみます
guest

回答2

0

解決が重複投稿されてしまっていたので削除しました

投稿2020/04/02 06:47

編集2020/04/02 07:22
3mp

総合スコア5

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

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

0

自己解決

本来ならModelであるReadDataクラスにファイル読み込み処理を書きたいのですが、どうしても多次元化してしまい面倒なのでいったんGraphFragmentに読み込み処理を書きました。

Java

1FileInputStream in = context.openFileInputStream(fileName);

ファイルを開く際に上の書き方をやめ、下の書き方にしました。

Java

1FileInputStream in = new FileInputStream(フォルダのパス + fileName);

これでちゃんとファイルのデータ読み込みができました。

ご指摘いただきありがとうございました。

投稿2020/04/02 06:41

3mp

総合スコア5

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

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

3mp

2020/04/03 10:08

書き方を上記のように修正し、配列ではなくリストを使用したところ、ReadDataクラスに読み込み処理を任せることができました。 データの数がファイルによって異なるため、可変長であるリストを使用するのが適切だったようです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問