스터디/Android+Java

Android SharedPreference PowerUp (2012.05.09)

Dalmangyi 2017. 10. 7.

안드로이드에서 기본 SharedPreferences는 매우 유용한 기능이기도 하지만 다양한 Object에 대해서 구현이 안되어 있습니다.

그래서 결국 찾다보니 어플만의 독립적인 내부 할당 공간에 Object단위로 저장하는 방법을 알아냈습니다.


SharedPreference도 결국은 파일로 기록되는 것이니, 속도차이는 없을것으로 생각됩니다.



import java.io.File;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.ObjectInputStream;

import java.io.ObjectOutputStream;


import android.app.Activity;

import android.content.Context;


import com.test.mediarecord.util.log;


public class DataCenterMethod {


public static boolean existFile(Context context, String filename){

File file = context.getFileStreamPath(filename);

if(file != null){

return true;

}else{

return false;

}

}

public static void writeObjectToFile(Context context, Object object, String filename) {


        ObjectOutputStream objectOut = null;

        try {


            FileOutputStream fileOut = context.openFileOutput(filename, Activity.MODE_PRIVATE);

            objectOut = new ObjectOutputStream(fileOut);

            objectOut.writeObject(object);

            fileOut.getFD().sync();


        } catch (IOException e) {

            e.printStackTrace();

        } finally {

            if (objectOut != null) {

                try {

                    objectOut.close();

                } catch (IOException e) {

                    log.e("writeObjectToFile objectOut.close() Error:"+e);

                }

            }

        }

    }



    /**

     * 

     * @param context

     * @param filename

     * @return

     */

    public static Object readObjectFromFile(Context context, String filename) {


        ObjectInputStream objectIn = null;

        Object object = null;

        try {


            FileInputStream fileIn = context.openFileInput(filename);

            objectIn = new ObjectInputStream(fileIn);

            object = objectIn.readObject();


        } catch (FileNotFoundException e) {

            // Do nothing

        } catch (IOException e) {

            e.printStackTrace();

        } catch (ClassNotFoundException e) {

            e.printStackTrace();

        } finally {

            if (objectIn != null) {

                try {

                    objectIn.close();

                } catch (IOException e) {

                 log.e("writeObjectToFile objectIn.close() Error:"+e);

                }

            }

        }


        return object;

    }

}


existFile : 파일이 존재하는지 확인하는 함수
writeObjectToFile : Object를 파일로 쓰는 함수
readObjectFromFile : 파일로부터 Object를 읽는 함수


fileName은 Path가 아닌 Name만 써주면 됩니다. (확장자 포함)
이 메소드들에게 사용되어지는 Object들은 항상 클래스에 'implements Serializable'를 사용하고 있어야됩니다.

WriteAbortedException 예외상황은 출력이 제대로 되지 않았을때 그 파일을 읽을때 발생됩니다.
그래서 ' fileOut.getFD().sync();' 이부분을 추가했습니다.

아직 정확히 파악은 안됬지만 Manifest에서 아래와 같은 권한(Permission)을 주어야되는듯 합니다.
<uses-permission android:name="android.permission.WRITE_INTERNAL_STORAGE" /> 

파일이 저장되는 경로는 '/data/data/어플패키지명/파일이름.확장자'에 저장됩니다.

참고 사이트 : 


댓글