[Android] 파일 입출력

유민국·2023년 7월 4일
0

안드로이드 Access app-specific files

안드로이드 저장소

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

Device File Explorer
-> 단말기에 저장된 파일을 볼 수 있다.

내부 저장소

  • 실행시킨 app을 통해서만 접근이 가능하다.
  • app 자체에만 엑서스할 수 있는 민감한 정보를 저장하기 좋다.
  • 파일 입출력 : openFileOutput, openFileInput
// MODE_PRIVATE : 덮어 씌우기
// MODE_APPEND : 이어서 쓰기
val fos = openFileOutput("data1.dat", MODE_PRIVATE)
val dos = DataOutputStream(fos)
dos.writeInt(100)
dos.writeDouble(11.11)
dos.writeBoolean(true)
dos.writeUTF("문자열1")

dos.flush()
dos.close()

외부 저장소

  • 단말기 내부의 공유 영역으로 모든 app이 접근 가능하다.
  • 단말기를 컴퓨터에 연결하면 탐색기를 통해 접근할 수 있는 영역을 의미한다.
  • Android/data 폴더에 저장되고, 저장된 파일은 다른 app이 접근할 수 없으며 app을 삭제하면 같이 삭제된다.

getExternalFilesDir

  • 외부 저정소의 경로(emulated/Android/data/패키지명/files)를 가져온다.
  • getExternalFilesDir 메서드의 매개변수에는 문자열을 넣어줄 수 있으며 files의 하위 폴더 이름을 넣어서 사용할 수 있다.
  • null을 넣으면 files까지의 경로가 된다.

쓰기

val filePath = getExternalFilesDir(null).toString()

val fos = FileOutputStream("${filePath}/data2.dat")
val dos = DataOutputStream(fos)

dos.writeInt(200)
dos.writeDouble(22.22)
dos.writeBoolean(false)
dos.writeUTF("문자열2")

dos.flush()
dos.close()
fos.close()

textView.text = "외부 저장소 앱 데이터 폴더에 저장"

읽기

val fis = FileInputStream("${filePath}/data2.dat")
val dis = DataInputStream(fis)

val data1 = dis.readInt()
val data2 = dis.readDouble()
val data3 = dis.readBoolean()
val data4 = dis.readUTF()

dis.close()
fis.close()

fileApp을 통한 접근

button5.setOnClickListener {
    // 파일 관리 앱의 액티비티를 실행한다.
    val fileIntent = Intent(Intent.ACTION_CREATE_DOCUMENT)
    fileIntent.addCategory(Intent.CATEGORY_OPENABLE)
    // MimeType을 설정한다.
    // MimeType이란? 파일에 저장되어 있는 데이터의 양식이 무엇인지를 타나내는 문자열
    // https://developer.mozilla.org/ko/docs/Web/HTTP/Basics_of_HTTP/MIME_types
    fileIntent.type = "*/*"
    writeActivityLauncher.launch(fileIntent)

    // 사용자가 저장할 파일을 선택하고 돌아오면 ResultCode는 RESULT_OK가 들어온다.

}

button6.setOnClickListener {
    // 파일 관리 앱의 액티비티를 실행한다.
    val fileIntent = Intent(Intent.ACTION_OPEN_DOCUMENT)
    fileIntent.type = "*/*"
    readActivityLauncher.launch(fileIntent)
}

파일 입출력

내부 저장소 : openFileOutput, openFileInput
외부 저장소 : FileInputStream, FileOutputStream

안드로이드 10 이상의 외부 저장소

외부 저장소에 저장된 파일은 모든 애플리케이션이 자유롭게 접근할 수 있어 보안에 문제가 되었다.
이에 안드로이드 10 부터는 외부 저장소에 제한을 두어 보안을 강화하게 되었다.
안드로이드 10에서는 외부 저장소의 정책을 무력화 할 수 있는 옵션이 있었으나 11부터는 이 옵션이 제거되어 외부 저장소의 자유로운 접근은 불가능하게 되었다.
이러한 외부 저장소를 Scoped Storage 정책이라 부른다.

Scoped Storage 정책

Scoped Storage는 다음과 같은 형태로 구성된다.
앱 데이터 폴더 : 읽고 쓰는데 권한이 필요가 없으며 해당 애플리이션만 접근이 가능하다. 애플리케이션 삭제 시 폴더도 같이 삭제된다.
미디어 파일들 : 사진, 동영상, 음원파일들을 저장하는 장소이다.
공용 파일들 : Downloads 폴더. 이 폴더에 저장된 파일은 모든 애플리케이션이 접근할 수 있다. 단, 코드를 통한 직접 접근은 불가능하고 단말기에 설치된 파일 관리 어플을 통해서만 접근이 가능하다. 즉, 파일 관리 어플을 실행해 사용자가 직접 파일을 선택해줘야 가능하다.

profile
안녕하세요 😊

0개의 댓글