GDSC HUFS 3기/Android with Kotlin Team 2

[2팀]16 파일 입출력

NakyungIm 2021. 11. 24. 01:41

이 글은 이것이 안드로이드다 with 코틀린(개정판)를 참고하여 작성하였습니다.

작성자 : 임나경

개발환경은 Windows, Android Studio입니다.

 

 

1. 초기상태

 

초기상태를 세팅한 상황입니다.

이 때, 밑에 Name 박스는 Palette에서 Plain Text입니다.

Plain Text의 default inputType은 textPersonName으로 지정되어 있습니다.

 

textPersonName을사용하면 한줄밖에 입력받지 못하기 때문에 체크를 해제하고,

texttextMultiLine을 체크합니다.

 

id 값을 바꿔준 뒤, 뷰바인딩 처리를 해줍니다.

 

 

2. 파일 입력(쓰기) 메인 코드

package com.example.fileio

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import com.example.fileio.databinding.ActivityMainBinding
import java.io.BufferedWriter
import java.io.File
import java.io.FileWriter

class MainActivity : AppCompatActivity() {

    val binding by lazy { ActivityMainBinding.inflate(layoutInflater) }
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(binding.root)

	// 버튼 누르면 writeText를 file로 넘겨줌
        with(binding) {
            btnSave.setOnClickListener {
                val content = textWrite.text.toString()
                val directory_name = "memo"
                val filename = "memo01.txt"
                writeTextFile(directory_name, filename, content)
            }
        }
    }

    fun writeTextFile(directory: String, filename: String, content: String){
        // 앱 기본경로/files/memo
        val dir = File(filesDir.path + "/" + directory) // 이름만 넘겨주면 파일 생성. dir : 파일 존재 여부
        if(!dir.exists()) dir.mkdirs()

        // 파일을 사용하기 위한 스트림 열기
        val fullpath = dir.path + "/" + filename
        val writer = FileWriter(fullpath)
        val buffer = BufferedWriter(writer) // 속도를 빠르기 하기 위해 buffer 사용
        buffer.write(content)
        buffer.close()
        writer.close()
   }
}

* directory 에는 전체 경로를 넘겨주어야 한다.

** mkdir() VS mkdirs()

  • mkdir() : 만들고자 하는 디렉토리의 상위 디렉토리가 존재하지 않을 경우, 생성 불가
  • mkdirs() : 만들고자 하는 디렉토리의 상위 디렉토리가 존재하지 않을 경우, 상위 디렉토리까지 생성

 

 

Device File Explorer를 연다.

data/data/com.example.fileio/files/memo/memo01.txt 를 확인할 수 있음

 

filename 변경 후 Synchronize 하면 다음처럼 동기화된다.

 

 

2. 파일 출력(읽기) 메인 코드

package com.example.fileio

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import com.example.fileio.databinding.ActivityMainBinding
import java.io.*

class MainActivity : AppCompatActivity() {

    val binding by lazy { ActivityMainBinding.inflate(layoutInflater) }
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(binding.root)

        with(binding) {
            val directory_name = "memo"
            val filename = "memo02.txt"
            btnSave.setOnClickListener {
                val content = textWrite.text.toString()
                writeTextFile(directory_name, filename, content)
            }

            val path = directory_name + "/" + filename
            val writtenContent = readTextFile(path)
            textRead.text = writtenContent
        }
    }

    fun readTextFile(path: String): String {
        val fullpath = File(filesDir.path + "/" + path) // path에는 디렉토리, 파일명을 넘겨줌
        if(!fullpath.exists()) return ""

        val reader = FileReader(fullpath)
        val buffer = BufferedReader(reader)

        val result = StringBuilder() // or StringBuffer(), 속도는 builder가 빠르고, buffer는 동시성을 지원
        var temp:String? = ""
        while(true){
            temp = buffer.readLine()
            if(temp == null) break
            result.append(temp) // 버퍼에 추가. 더이상 읽을 수 없으면 빠져나감
       }
        buffer.close()
        reader.close()
        return result.toString()
    }

   }
}

 

** mkdir VS mkdirs()

write한 것을 read한 결과 화면

 

이제 내부 저장소에 파일 저장, 읽기, 쓰기 가능하다!!