앙큼한 개발기록

[android] kotlin 파일 저장 및 호출 방법 본문

개발/android

[android] kotlin 파일 저장 및 호출 방법

angkeum 2023. 5. 17. 22:26

안드로이드 프로젝트를 하면서 

크기가 조금 있는 데이터를 저장하고 호출하고 싶을때 

내부 저장소를 사용해서 파일로 저장한다. 

 

예를 들어 메모장의 메모 내용이나 쇼핑앱의 장바구니와 같은 정보를 파일로 저장해서 사용하면

네트워크 통신을 하지 않고도 내부에서 처리가 가능하고 

인터넷이 끊겨도 호출할 수 있다.

 

내부 저장소는 data class를 .ser 파일로 저장하고 호출하는 방식을 정리해 보았다

 

우선 필요한건 fileSream, dataClass, 

 

- FileObjectStream.kt

import android.content.Context
import java.io.IOException
import java.io.ObjectInputStream
import java.io.ObjectOutputStream

class FileObjectStream {
    companion object {
        const val FILE_NAME = "file_name.ser"

        fun writeFile(context: Context, name: String, obj: Any) {
            context.openFileOutput(name, Context.MODE_PRIVATE).use {
                val oos = ObjectOutputStream(it)
                oos.writeObject(obj)
                oos.close()
            }
        }

        fun readFile(context: Context, name: String): Any? {
            return try {
                var result: Any?
                context.openFileInput(name).use {
                    val ois = ObjectInputStream(it)
                    result = ois.readObject()
                    ois.close()
                }

                result
            } catch (e: IOException) {
                e
            }
        }

        fun removeFile(context: Context, name: String) {
            context.openFileOutput(name, Context.MODE_PRIVATE).use {
                val oos = ObjectOutputStream(it)
                oos.writeObject(null)
                oos.close()
            }
        }
    }
}

 파일 명을 상수로 선언하면 나중에 저장하고 호출할때 사용하기 좋다. 

 

- DataClass.kt

import java.io.Serializable
import java.util.Date

data class DataClass(
    val customClass: CustomClass? = null,
    val price: Double = 0.0,
    val amount: Double = 0.0,
    val createdAt: Date,
    val list: List<CustomClass> = arrayListOf()
): Serializable


data class CustomClass(
    val uid: String?,
    val name: String?,
    val code: String?,
    val type: String?,
    val active: Boolean = true,
    val createdAt: Date?,
): Serializable

이런 식으로 데이터 클래스를 선언하여 파일로 저장할 수 있다 

안에 들어가는 파라미터는 대부분 가능한 것 같다. 모든 타입을 다 해보지는 않았으나 기본적으로 사용되는 

String, Double, Integer, Boolea, Date, Class, ArrayList 등 다 들어간다.

 

쓰기

val data = CustomClass(~~~ 데이터에 들어가는 파라미터들 ~~~)
// mainactivity, fragment에서 context (activity)를 사용
FileObjectStream.writeFile(this, FileObjectStream.FILE_NAME, data)

 

읽기

val data = FileObjectStream.readFile(this, FileObjectStream.FILE_NAME)
if (data is DataClass) {
	// 여기서 데이터 처리
}
else {
    Log.d("ERR-DATA", "file read error: $data")
}

 

 

Comments