개발포스팅은 언제나 유통기한을 조심하세요.
Github : https://github.com/junghun9102/AndroidTemplate
Branch : base/internal_storage
내부저장소와 외부저장소는 앱의 내부냐 외부냐의 차이일 뿐이다.
Android 10이 나오면서 외부저장소에 대한 보안이 강화되었다.
사실 대부분의 앱들이 굳이 외부저장소가 필요한가 싶다.
내부저장소를 사용하는 branch를 완성하기는 했는데 만들고 나니
별내용이 없는데 이걸 왜 굳이 작성했을까 하는 생각이 들었다.
사실 Context.filesDir.path에서 받아오는 내부저장소의 rootPath가 전부이다.
나머지는 파일을 이용하는 작업일 뿐이다.
내부저장소를 이용해 카메라 사진을 저장할 때 FileProvider를 사용하면 된다.
핵심 코드
MainActivity
private val internalStoragePath: String by lazy { filesDir.path }
private val saveFileDirectory = "/textFolder"
private val saveStoragePath: String by lazy { "$internalStoragePath$saveFileDirectory" }
private val fileName = "textFileName.txt"
부가 코드
데이터 로드
// 1
val savedNoteFile = File(saveStoragePath, fileName)
val note = FileManager.getTextFromFile(savedNoteFile)
showNote(note)
// // 2
// val inputStream = openFileInput(fileName)
// val note = FileManager.getTextFromInputStream(inputStream)
// inputStream.close()
// showNote(note)
데이터 저장
// 1
val file = File(saveStoragePath, fileName)
val textToSave = et_main_note.text.toString()
FileManager.writeTextToFile(file, textToSave)
// // 2
// val outputStream = openFileOutput(fileName, Context.MODE_PRIVATE)
// val textToSave = et_main_note.text.toString()
// FileManager.writeTextToOutputStream(outputStream, textToSave)
// outputStream.close()
주석처리해 놓은 코드와 같이 파일을 거치지 않고 바로 stream으로 받아올 수 있다.
단, 내부저장소의 기본 저장소를 사용해야만 하는 것 같다.
FileManeger
object FileManager {
@Throws(IOException::class)
fun getTextFromFile(file: File): String {
val inputStream = file.inputStream()
val text = getTextFromInputStream(inputStream)
inputStream.close()
return text
}
@Throws(IOException::class)
fun getTextFromInputStream(inputStream: InputStream): String {
val br = inputStream.bufferedReader()
val text = br.useLines { lines ->
lines.fold("") { sum, line ->
sum + if (sum.isNotBlank()) ", $line" else line
}
}
br.close()
return text
}
@Throws(IOException::class)
fun writeTextToFile(file: File, text: String) {
val outputStream = file.outputStream()
writeTextToOutputStream(outputStream, text)
outputStream.close()
}
@Throws(IOException::class)
fun writeTextToOutputStream(outputStream: OutputStream, text: String) {
val bw = outputStream.bufferedWriter()
bw.write(text)
bw.close()
}
}
'창고' 카테고리의 다른 글
custom_dialog (+custom_toast) (0) | 2020.05.02 |
---|---|
Activity간의 화면 전환 (0) | 2020.03.11 |
permission (0) | 2020.02.26 |
DP(Device Independence Pixel)? (0) | 2019.06.09 |
프로그래밍 용어 정리 (0) | 2019.05.27 |