[5팀] 코틀린 안드로이드 기초강의_39~40 | 파일 입출력, SharedPrefere
이 글은 이것이 안드로이드다 with 코틀린(개정판)를 참고하여 작성하였습니다.
작성자 : 윤승민
개발환경은 Windows, Android Studio입니다.
1. 파일 입출력
파일 입력은 어떻게 이루어지는가?
**경로(path)**를 지정하여 지정한 경로에 파일이 생성되도록 한다.
우리는 원하는 경로에 폴더를 만들고 그 폴더 안에 파일을 생성해볼 것이다.
그렇다면 대충 과정을 상상해보자.
1. 폴더를 생성할 위치, 즉 경로를 불러온다.
2. 경로를 불러왔으면 폴더의 이름을 지정하여 지정한 이름으로 폴더를 생성한다.
3. 파일의 이름을 지정하고 지정한 이름의 파일을 폴더 안에 생성한다.
이러한 과정으로 파일 입력이 이루어질 것이다.
좀 더 나아가서 어떤 동작을 했을 때 파일 입력이 일어나도록 구성해보자.
파일 입력을 앱에서 구현해보자
textView를 하나 만들어서 그 안에 text를 작성하고 button을 누르면 클릭 이벤트를 통해 파일 입력이 되는 구성을 진행해보겠다.
1. textView, button을 생성한다.
2. 폴더 이름과 파일 이름을 지정한다.
val directoryName ="memo"
val fileName = "memo01.txt"
3. 파일 입력의 기능을 해주는 함수를 구현한다.
fun writeTextFile(directory:String, fileName:String, content:String){
// 앱 기본경로 / files / memo
val dir = File(filesDir.path + "/" + directory) // 전달된 디렉토리 파일로 생성
if(!dir.exists()) dir.mkdirs() // 검사해서 파일이 없으면 디렉토리 생성
val fullPath = dir.path + "/" + fileName
val writer = FileWriter(fullPath)
val buffer = BufferedWriter(writer) //속도를 빠르게 해주기 위해 버퍼도 사용한다.
buffer.write(content)
buffer.close()
writer.close()
}
(폴더의 이름,파일의 이름,파일에 넣을 내용)의 매개변수로 구성되어있음을 알 수 있다.
폴더의 경로를 설정한 다음 파일의 경로를 설정한다.
마지막에는 writer와 buffer를 통해 파일 입력을 진행한다.
4. 텍스트를 입력하고 버튼을 누르면 클릭 이벤트를 발생시킨다.
binding.btnSave.setOnClickListener {
val content = binding.textWrite.text.toString()
writeTextFile(directoryName,fileName,content)
}
textView에 저장된 text를 불러와 파일 입력을 담당하는 함수에 값을 넘겨주는 방식이다.
버튼을 눌러보자!
1. 원하는 text를 적고 저장하기를 누른다.
2. 우리는 이제 파일이 저장된 경로를 찾아야 하므로 오른쪽 하단을 보자 (Device File Explorer)
3. data → data로 이동한 후 프로젝트 이름이 속한 폴더를 찾는다.
4. 최종적으로 파일이 생성된 것을 확인했으니 파일의 내용도 확인해보자.
파일 출력을 구현해보자!
파일의 내용이 출력될 textView를 하나 만들어준다.
버튼을 눌렀을 때 파일이 저장됨 → 저장된 파일의 내용을 로드
val path = directoryName + "/" + fileName
val writtenContent = readTextFile(path)
binding.textRead.text = writtenContent
readTextFile이라는 함수를 통해서 경로에 해당하는 파일의 내용을 불러온다.
그리고 textView에 접근해서 text를 불러온 파일의 내용으로 교체한다.
파일의 내용을 불러오는 readTextFile함수를 구현해보자.
fun readTextFile(path:String): String {
val fullpath = File(filesDir.path + "/" + path)
if(!fullpath.exists()) return ""
val reader = FileReader(fullpath)
val buffer = BufferedReader(reader)
val result = StringBuilder() // StringBuffer()
var temp : String? = ""
while (true){
temp = buffer.readLine()
if(temp == null) break
result.append(temp)
}
buffer.close()
reader.close()
return result.toString()
}
경로를 불러온 뒤 while문을 통해 내용을 모두 입력받는 것을 볼 수 있다.
입력받은 내용은 전부 result에 append해준다.
마지막으로 close해주고 result를 return한다.
2. SharedPreference
앱을 처음 열었을 때만 보여주고 싶다면?
앱을 실행시켰을 때 환영하는 문구와 함께 이미지를 화면에 출력하고 싶다.
하지만 환영은 처음에만 하고 끝내야지 계속 환영하면 과잉친절이다.
사용자가 부담스러워하지 않도록 처음 실행할 때만 이미지를 출력하도록 해보자!
1. SharedPreference를 불러온다.
val shared = getSharedPreferences("파일명", Context.MODE_PRIVATE)
2. 스위치 역할을 해줄 getBoolean을 작성한다.
val firstOpen = shared.getBoolean("key_first_open",false)
디폴드 값은 false로 설정한다.
3. 처음 열었다면 디폴드 값은 false이지만 이후에는 값이 true가 되도록 작성한다.
val editor = shared.edit()
editor.putBoolean("key_first_open",true)
editor.commit()
4. 처음에만 false이므로 이를 이용해 if문을 작성하여 이미지가 다음부턴 안보이도록 한다.
if(firstOpen){
binding.bear.visibility= View.GONE
}
위협적이게 생긴 북극곰이 두 팔 벌려 환영하고 있다.
이제 앱을 나갔다 다시 들어가본다.
더이상 북극곰은 우릴 환영하지 않는다. (처음 이외에는 boolean값이 true이기 때문에 이미지 출력 x)