Deperecated/Android_강의

안드로이드 - 데이터 관리 - 파일 입출력

누알라리 2020. 2. 19. 21:48
1. 안드로이드 저장소

- 안드로이드는 애플리케이션이 데이터를 저장할 수 있는 저장소를 두 가지로 제공하고 있다.

 

1. 내부 저장소 :

- 애플리케이션을 통해서만 접근이 가능하다.

- 코드를 통해서 접근할 수 있는 저장소.

- 각 애플리케이션 마다 내부 저장소를 갖고있으며 앱이 삭제되면 내부 저장소도 삭제된다.

 

2. 외부 저장소 :

- 단말기 내부의 공유 영역으로 모든 애플리케이션이 접근 가능하다.

- 단말기를 컴퓨터에 연결하면 탐색기를 통해 접근 할 수 있는 영역을 의미한다.

- 용량 or 공유 목적으로 사용된다.

 

2. 파일 입출력

1. 내부 저장소

- openFileInput, openFileOutput

 

2. 외부 저장소

- FileInputStream, FileOutputStream

- 외부 저장소 저장시 "android/data/패키지명" 폴더에 저장하면 애플리케이션 삭제 시 같이 삭제되며 그 외의 폴더는 유지된다.

 

3. 예제 - 내부저장소
class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        button.setOnClickListener { view ->

            // 1. 예외처리
            try{

                // 2. FileOutputStream 추출 -> 내부저장소와 연결되어있는 스트림.
                // APPEND : 추가 / PRIVATE : 덮어씀
                // 내부 저장소에 "myFile"이라는 데이터를 만든거고, 이 파일에다가 데이터를 쓴것.
                var output = openFileOutput("myFile.dat", Context.MODE_PRIVATE)

                // 3. 새로 생성한 데이터 쓰기.
                var dos = DataOutputStream(output)
                dos.writeInt(100)
                dos.writeDouble(11.11)
                dos.writeUTF("안녕하세요")
                dos.flush()
                dos.close()

                textView.text = "저장완료"

            }catch (e : Exception)
            {
                e.printStackTrace()
            }
        }

        button2.setOnClickListener { view ->

            try {

                // 4. dataInputStream 추출
                var input = openFileInput("myFile.dat")

                // 5. 데이터 읽어오기.
                var dis = DataInputStream(input)
                var value1 = dis.readInt()
                var value2 = dis.readDouble()
                var value3 = dis.readUTF()
                dis.close()

                textView.text = "value1 : ${value1}\n"
                textView.append("value2 : ${value2}\n")
                textView.append("value3 : ${value3}\n")

            }catch (e : Exception)
            {
                e.printStackTrace()
            }
        }
    }
}

 

4. 외부저장소

- 외부저장소 사용엔 권한요청이 필요하다.

- path = Environment.getExternalStorageDirectory().absolutePath + "/android/data/" + packageName에 파일을 저장하면 패키지(앱)이 삭제될 때 저 데이터도 같이 사라지게 된다.

 

class MainActivity : AppCompatActivity() {

    var permission_list = arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE)

    // 2. 외부저장소 파일 경로를 담을 변수 생성
    var path : String? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)


        // 3. 외부저장소 경로 + "/android/data/" + 패키지명이기 때문에 어플이 삭제되면 같이 삭제된다.
        path = Environment.getExternalStorageDirectory().absolutePath + "/android/data/" + packageName

        // 1. 권한 요청
        checkPermission()

        // 4.path 경로에 해당하는 디렉토리가 없으면 만든다.
        var file = File(path)
        if(file.exists() == false)
        {
            file.mkdir()
        }

        button3.setOnClickListener { view ->
            try {

                var output = FileOutputStream(path + "/sdFile.dat")
                var dos = DataOutputStream(output)
                dos.writeInt(200)
                dos.writeUTF("반갑습니다")
                dos.flush()
                dos.close()
                textView.text = "저장완료"

            }catch (e : Exception)
            {
                e.printStackTrace()
            }
        }

        button4.setOnClickListener { view ->

            try {

                // 4. dataInputStream 추출
                var input = FileInputStream(path + "/sdFile.dat")

                // 5. 데이터 읽어오기.
                var dis = DataInputStream(input)
                var value1 = dis.readInt()
                var value2 = dis.readUTF()
                dis.close()

                textView.text = "value1 : ${value1}\n"
                textView.append("value2 : ${value2}\n")

            }catch (e : Exception)
            {
                e.printStackTrace()
            }
        }
    }


    fun checkPermission()
    {
        if(Build.VERSION.SDK_INT < Build.VERSION_CODES.M)
        {
            return
        }

        for(permission in permission_list)
        {
            var chk = checkCallingOrSelfPermission(permission)
            if(chk == PackageManager.PERMISSION_DENIED)
            {
                requestPermissions(permission_list, 0)
            }
        }
    }
}