Android - 파일 입출력 예제 (Read, Write, 내부, 외부 저장소)

JS · 23 Dec 2020

내부, 외부 저장소에 파일을 읽고 쓰는 예제를 소개합니다.

내부, 외부 저장소

앱의 내부, 외부 저장소란 다음 경로를 의미하며 모두 권한 없이 사용할 수 있는 앱의 데이터 공간입니다.

  • 내부 저장소 : /data/data/[package name]/
  • 외부 저장소 : /storage/emulated/0/Android/data/[package name]/

내부, 외부 저장소의 경로는 다음 API를 이용하여 얻을 수 있습니다.

  • 내부 저장소 : Context.getFilesDir()
  • 외부 저장소 : Context.getExternalFilesDir(null)

저장소에 대한 자세한 내용은 앱 데이터 폴더 경로 및 내부/외부 저장소 설명를 참고해주세요.

파일 입출력

Byte 단위의 데이터를 읽고 쓰려면 다음 클래스를 이용하면 됩니다.

  • FileInputStream, FileOutputStream
  • BufferedInputStream, BufferedoutputStream

String 데이터를 읽고 쓰려면 다음 클래스를 사용하시면 됩니다.

  • FileReader, FileWiter
  • BufferedReader, BufferedWriter

이 글에서는 BufferedReader, BufferedWriter을 이용하여 Text를 읽고 쓰는 예제를 만들어보겠습니다.

일반적으로 FileReader보다 BufferedReader를 사용하는 것이 성능에 좋습니다. BufferedReader에 대한 자세한 내용은 Java - BufferedReader, BufferedWriter 예제를 참고하시면 됩니다.

파일 쓰기 예제

다음과 같이 내부 저장소의 파일에 문자열을 저장할 수 있습니다. close()가 호출되면 append()로 입력된 문자열이 파일에 저장됩니다.

val filePath = filesDir.path + "/myText.txt"
Log.d("Test", "path : $filePath")
writeTextToFile(filePath)


fun writeTextToFile(path: String) {
    val file = File(path)
    val fileWriter = FileWriter(file, false)
    val bufferedWriter = BufferedWriter(fileWriter)

    bufferedWriter.append("Test1\n")
    bufferedWriter.append("Test2")
    bufferedWriter.newLine()
    bufferedWriter.append("Test3\n")
    bufferedWriter.close()
}

실행해보면 다음과 같은 경로에 저장이 됩니다.

12-23 20:22:34.110  5218  5218 D Test    : path : /data/user/0/com.example.app/files/myText.txt

다음과 같이 내부 저장소에 파일이 저장되었는지 확인할 수도 있습니다.

generic_x86_arm:/data/data/com.example.app/files # cat myText.txt   
Test1
Test2
Test3

파일 읽기 예제

다음과 같이 내부 저장소에 저장된 파일을 읽을 수 있습니다. readlines()forEach()를 이용하여 line 단위로 문자열을 읽을 수 있습니다.

val filePath = filesDir.path + "/myText.txt"
readTextFromFile(filePath)


fun readTextFromFile(path: String) {
    val file = File(path)
    val fileReader = FileReader(file)
    val bufferedReader = BufferedReader(fileReader)

    bufferedReader.readLines().forEach() {
        Log.d("Test", it)
    }
}

외부 저장소 파일 읽고 쓰기

다음과 같이 외부 저장소의 경로만 인자로 넘겨주면 됩니다.

val filePath = getExternalFilesDir(null)!!.path + "/myText.txt"
Log.d("Test", "path : $filePath")

writeTextToFile(filePath)
readTextFromFile(filePath)

위 코드를 실행해보면 다음과 같은 경로의 파일을 저장하고 읽습니다.

12-23 20:27:46.277  5365  5365 D Test    : path : /storage/emulated/0/Android/data/com.example.app/files/myText.txt
12-23 20:27:46.282  5365  5365 D Test    : Test1
12-23 20:27:46.282  5365  5365 D Test    : Test2
12-23 20:27:46.283  5365  5365 D Test    : Test3

getExternalFilesDir() API

디바이스를 PC에 연결하였을 때 PC에서 디바이스의 저장 공간을 볼 수 있는데요. 그 Root path가 storage/emulated/0/입니다.

/storage/emulated/0/Android/data/는 외장 공간에서 앱의 전용 데이터 폴더로 할당되는 공간입니다. 이 폴더의 Path는 getExternalFilesDir(null)로 가져올 수 있습니다.

인자로 null을 넘기면 "../files/"가 리턴되며, 인자로 Environment.DIRECTORY_MUSIC를 넘기면 "../files/Music"의 형태로 리턴됩니다.

val appMusicDir = getExternalFilesDir(Environment.DIRECTORY_MUSIC)
Log.d("Test", "path : ${appMusicDir!!.path}")

Output:

12-23 20:52:50.630  5590  5590 D Test    : path : /storage/emulated/0/Android/data/com.example.example/files/Music

DIRECTORY_MUSIC 외에도 다음과 같은 것들을 인자로 넘길 수 있습니다.

  • Environment.DIRECTORY_MUSIC
  • Environment.DIRECTORY_PODCASTS
  • Environment.DIRECTORY_RINGTONES
  • Environment.DIRECTORY_ALARMS
  • Environment.DIRECTORY_NOTIFICATIONS
  • Environment.DIRECTORY_PICTURES
  • Environment.DIRECTORY_MOVIES
댓글을 보거나 쓰려면 이 버튼을 눌러주세요.
codechachaCopyright ©2019 codechacha