Androidでのファイルの読み書き

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
codec

Androidでのファイルの読み書き

#1

投稿記事 by codec » 9年前

初めまして、codeと申します。
Androidでファイルの読み書きを行いたいのですが、配列変数を扱いたいため、Serializableを利用したいと考えています。
しかし下記のコードを実行するとlogで「c」の所まで出力されるのですがそこでエラーを出して止まってしまいます。
Androidが絡むと類似例が見つからないのでどうすればいいのか分からず困っています。
どなたかお助けください。

コード:

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

import android.content.Context;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

public class TextAdapter extends BaseAdapter {
    private Context context;
    private String[] strings;
    private String[] room;

    public TextAdapter(Context context) {
    	Log.e("DEBUG", "a");
    	Sch sch = null;
        this.context = context;
        strings = new String[49];
        room = new String[36];
        ObjectInputStream in = null;
        Log.e("DEBUG", "b");
        ObjectOutputStream out = null;
        try {
        	Log.e("DEBUG", "c");
            out = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream("SaveData.dat")));
            Log.e("DEBUG", "d");
            out.writeObject(sch);
            out.flush();
        } catch (Exception e) {
            Log.d("FILE_OUTPUT", "Error");
        }finally {
        	if (out != null) {
        		try {
        			out.close();
        		}catch (IOException e) {}
        	}
        }
        try {
        	 in = new ObjectInputStream(new BufferedInputStream(new FileInputStream("SaveData.dat")));
        	 Log.e("DEBUG", "e");
        	 sch = (Sch)in.readObject();
        	 Log.e("DEBUG", "f");
        	 in.close();
        	 Log.e("DEBUG", "g");
        } catch (Exception e) {
            Log.d("FILE_INPUT", "Error");
            
        }

アバター
Justy
副管理人
記事: 122
登録日時: 10年前
住所: 神奈川県

Re: Androidでのファイルの読み書き

#2

投稿記事 by Justy » 9年前

エラーの内容はなんですか?
それが判れば解決できる問題です。


見た感じ書き込み先のファイルパスがおかしいように見えるので、まだ解決していないようなら
ファイルパスを正しく設定(つまりアクセス権限があるところ)すればうまく動くのではないかと。

或いは

コード:

new FileOutputStream("SaveData.dat")
の代りに

コード:

context.openFileOutput("SaveData.dat", Context.MODE_PRIVATE)
としてみるとか。

codec

Re: Androidでのファイルの読み書き

#3

投稿記事 by codec » 9年前

Justy様、ご返信ありがとうございます。
すみません、エラーログを見てみたのですがイマイチ分かりません…
これは一体どのような状況になっているのでしょうか…?

11-27 23:07:40.091: ERROR/DEBUG(11324): a
11-27 23:07:40.111: ERROR/DEBUG(11324): b
11-27 23:07:40.111: ERROR/DEBUG(11324): c
11-27 23:07:40.111: DEBUG/FILE_OUTPUT(11324): Error
11-27 23:07:40.111: DEBUG/FILE_INPUT(11324): Error
11-27 23:07:40.111: WARN/dalvikvm(11324): threadid=1: thread exiting with uncaught exception (group=0x40015560)
11-27 23:07:40.121: ERROR/AndroidRuntime(11324): FATAL EXCEPTION: main
11-27 23:07:40.121: ERROR/AndroidRuntime(11324): java.lang.RuntimeException: Unable to start activity ComponentInfo{example.android/example.android.CalActivity}: java.lang.NullPointerException
11-27 23:07:40.121: ERROR/AndroidRuntime(11324): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647)
11-27 23:07:40.121: ERROR/AndroidRuntime(11324): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
11-27 23:07:40.121: ERROR/AndroidRuntime(11324): at android.app.ActivityThread.access$1500(ActivityThread.java:117)
11-27 23:07:40.121: ERROR/AndroidRuntime(11324): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
11-27 23:07:40.121: ERROR/AndroidRuntime(11324): at android.os.Handler.dispatchMessage(Handler.java:99)
11-27 23:07:40.121: ERROR/AndroidRuntime(11324): at android.os.Looper.loop(Looper.java:123)
11-27 23:07:40.121: ERROR/AndroidRuntime(11324): at android.app.ActivityThread.main(ActivityThread.java:3683)
11-27 23:07:40.121: ERROR/AndroidRuntime(11324): at java.lang.reflect.Method.invokeNative(Native Method)
11-27 23:07:40.121: ERROR/AndroidRuntime(11324): at java.lang.reflect.Method.invoke(Method.java:507)
11-27 23:07:40.121: ERROR/AndroidRuntime(11324): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:864)
11-27 23:07:40.121: ERROR/AndroidRuntime(11324): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:622)
11-27 23:07:40.121: ERROR/AndroidRuntime(11324): at dalvik.system.NativeStart.main(Native Method)
11-27 23:07:40.121: ERROR/AndroidRuntime(11324): Caused by: java.lang.NullPointerException
11-27 23:07:40.121: ERROR/AndroidRuntime(11324): at example.android.TextAdapter.<init>(TextAdapter.java:61)
11-27 23:07:40.121: ERROR/AndroidRuntime(11324): at example.android.CalActivity.onCreate(CalActivity.java:18)
11-27 23:07:40.121: ERROR/AndroidRuntime(11324): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
11-27 23:07:40.121: ERROR/AndroidRuntime(11324): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
11-27 23:07:40.121: ERROR/AndroidRuntime(11324): ... 11 more

アバター
Justy
副管理人
記事: 122
登録日時: 10年前
住所: 神奈川県

Re: Androidでのファイルの読み書き

#4

投稿記事 by Justy » 9年前

new ObjectOutputStreamの行で例外が出てるようですね。
どういう例外が出たのか例外メッセージ(e.getMessage()で表示するかブレークポイントで止めて eの中身を見るなど)を
調べて見るといいでしょう。

ところで先に書いた、アクセス権限のあファイルパスへの修正は試されましたか?

codec

Re: Androidでのファイルの読み書き

#5

投稿記事 by codec » 9年前

返信遅れましたが、仰るとおり、

コード:

context.openFileOutput("SaveData.dat", Context.MODE_PRIVATE)
に変えたら上手くいきましたありがとうございました!

アバター
Justy
副管理人
記事: 122
登録日時: 10年前
住所: 神奈川県

Re: Androidでのファイルの読み書き

#6

投稿記事 by Justy » 9年前

 それでうまくいった、ということはやはりファイルのアクセス権限まわりのようですね。
 Exception eの中にそのあたりの情報が入っているので、今度からエラー時にそのあたりの情報も
出力するようにしておくといいでしょう。


 一応簡単に説明しておきますと、FileOutputStreamで指定した場合、
そのアプリがアクセス権をもつファイルパスを自前で指定しないといけません。
 例えば、"/data/data/" + this.getPackageName() + "SaveData.dat"のような形で。
 ファイル名だけを書いた場合ルートが指定された見なされ、大抵のAndroidは
root権限でもなければ書き込みはできません。

 openFileOutputの場合は "/data/data/パッケージ名/files"ディレクトリの中に
格納してくれますので、他に問題がなければアクセスできる、というわけですね。

閉鎖

“C言語何でも質問掲示板” へ戻る