내부, 외부 저장소에 파일을 읽고 쓰는 예제를 소개합니다.
내부, 외부 저장소
앱의 내부, 외부 저장소란 다음 경로를 의미하며 모두 권한 없이 사용할 수 있는 앱의 데이터 공간입니다.
- 내부 저장소 : /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
Related Posts
- Android 14 - 사진/동영상 파일, 일부 접근 권한 소개
- Android - adb push, pull로 파일 복사, 다운로드
- Android 14 - 암시적 인텐트 변경사항 및 문제 해결
- Jetpack Compose - Row와 Column
- Android 13, AOSP 오픈소스 다운로드 및 빌드
- Android 13 - 세분화된 미디어 파일 권한
- Android 13에서 Notification 권한 요청, 알림 띄우기
- Android 13에서 'Access blocked: ComponentInfo' 에러 해결
- 에러 해결: android gradle plugin requires java 11 to run. you are currently using java 1.8.
- 안드로이드 - 코루틴과 Retrofit으로 비동기 통신 예제
- 안드로이드 - 코루틴으로 URL 이미지 불러오기
- Android - 진동, Vibrator, VibrationEffect 예제
- Some problems were found with the configuration of task 에러 수정
- Query method parameters should either be a type that can be converted into a database column or a List
- 우분투에서 Android 12 오픈소스 다운로드 및 빌드
- Android - ViewModel을 생성하는 방법
- Android - Transformations.map(), switchMap() 차이점
- Android - Transformations.distinctUntilChanged() 소개
- Android - TabLayout 구현 방법 (+ ViewPager2)
- Android - 휴대폰 전화번호 가져오는 방법
- Android 12 - Splash Screens 알아보기
- Android 12 - Incremental Install (Play as you Download) 소개
- Android - adb 명령어로 bugreport 로그 파일 추출
- Android - adb 명령어로 App 데이터 삭제
- Android - adb 명령어로 앱 비활성화, 활성화
- Android - adb 명령어로 특정 패키지의 PID 찾기
- Android - adb 명령어로 퍼미션 Grant 또는 Revoke
- Android - adb 명령어로 apk 설치, 삭제
- Android - adb 명령어로 특정 패키지의 프로세스 종료
- Android - adb 명령어로 screen capture 저장
- Android - adb 명령어로 System 앱 삭제, 설치
- Android - adb 명령어로 settings value 확인, 변경
- Android 12 - IntentFilter의 exported 명시적 선언
- Android - adb 명령어로 공장초기화(Factory reset)
- Android - adb logcat 명령어로 로그 출력