-
[android] android 파일 처리 , 실습 간단 일기장app/android 2022. 1. 13. 17:52반응형
파일 처리의 기본
내장 메모리
앱을 종료했다가 다음에 다시 실행할 때 사용했던 곳부터 이어서 작업하고
싶은 경우 내장 메모리에 파일을 저장하고 읽어오는 방식을 활용함
내장 메모리의 저장 위치 : /data/data/패키지명/files 폴더
파일 읽기
Context 클래스의 openFileInput() 메소드 사용
fileInputStream을 반환함
파일 쓰기
openFileOutput() 메소드 사용
FileOutputStream을 반환함
jdk에서 제공하는 파일을 읽거나 쓰는 java.io.FileInputStream 클래스와
java.io.FileOutputStream의 read(), write() 메소드를 사용하여 파일 처리
파일 처리
내장 메모리에서 파일을 읽거나 쓰는 일반적인 절차
openFileOutput(), OpenFileInput()으로 파일 열기
->
read() 또는 write() 로 파일 읽기/쓰기
->
close()로 파일 닫기
파일을 쓰고 읽는 기본 예제
activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".MainActivity"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="0000000000" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/btnWrite" android:text="내장 메모리에 파일 쓰기"/> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/btnRead" android:text="파일 읽기"/> </LinearLayout>
MainActivity.kt
package aca.hankok.ex8_1 import android.content.Context import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.widget.Toast import kotlinx.android.synthetic.main.activity_main.* import java.io.IOException import java.nio.charset.Charset class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) btnWrite.setOnClickListener { var outFs = openFileOutput("file.txt", Context.MODE_PRIVATE) var str = "소프트웨어공학과" outFs.write(str.toByteArray()) outFs.close() Toast.makeText(applicationContext, "file write ok ...", Toast.LENGTH_LONG).show() } btnRead.setOnClickListener { try { var inFs = openFileInput("file.txt") var txt = ByteArray(70) inFs.read(txt) var str = txt.toString(Charsets.UTF_8) Toast.makeText(applicationContext, "읽어옴" + str , Toast.LENGTH_LONG).show() } catch (e : IOException){ Toast.makeText(applicationContext, "read error" , Toast.LENGTH_LONG).show() } } } }
실행결과
파일을 읽어왔다는 alert 을 볼 수 있다.
<실습> 간단 일기장 앱 만들기
날짜를 선택했을 때 그 날짜의 일기가 없으면 일기를 쓸 수 있고,
그 날짜의 일기가 있으면 일기 내용을 보여주도록 만들기
activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".MainActivity"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="00000000000" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" /> <DatePicker android:id="@+id/datePicker1" android:datePickerMode="spinner" android:layout_width="wrap_content" android:layout_height="wrap_content"/> <EditText android:id="@+id/edtDiary" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="#00ff00" android:lines="8" /> <Button android:id="@+id/btnWrite" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Button" android:enabled="false"/> </LinearLayout>
MainActivity.kt
package com.cookandroid.project8_1 import android.content.Context import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.widget.DatePicker import android.widget.Toast import kotlinx.android.synthetic.main.activity_main.* import java.io.IOException import java.util.* class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) this.setContentView(R.layout.activity_main) this.title = "간단 일기장" val cal = Calendar.getInstance() val cYear = cal.get(Calendar.YEAR) val cMonth = cal.get(Calendar.MONTH) val cDay = cal.get(Calendar.DAY_OF_MONTH) var fileName : String = "" datePicker1.init(cYear, cMonth, cDay, DatePicker.OnDateChangedListener { datePicker, i, i2, i3 -> fileName = "" + i + "_" + (i2 +1) + "_" + i3 + ".txt" var str = readDiary(fileName) edtDiary.setText(str) btnWrite.isEnabled = true }) btnWrite.setOnClickListener { var ouFs = openFileOutput(fileName, Context.MODE_PRIVATE) var str = edtDiary.text.toString() ouFs.write(str.toByteArray()) ouFs.close() Toast.makeText(applicationContext, "$fileName 이 저장되었습니다.", Toast.LENGTH_LONG).show() } }//OnCreate end fun readDiary(fileName: String) : String? { var diaryStr : String? = null try { var inFs = openFileInput(fileName) var txt = ByteArray(500) inFs.read(txt) inFs.close() diaryStr = txt.toString(Charsets.UTF_8) btnWrite.text = "수정하기" } catch (e: IOException) { edtDiary.hint = "일기 없음" btnWrite.text = "새로 저장" } return diaryStr } }
실행결과
완성^^~~~~~
반응형'app > android' 카테고리의 다른 글
[android] android 어뎁터 뷰 (0) 2022.01.13 [android] android 액티비티와 인텐트 (0) 2022.01.13 [android] android 번외 로그인 페이지 만들기 (0) 2021.10.28 [android] android 고급 위젯 다루기2 (0) 2021.10.28 [android] android 고급 위젯 다루기1 (0) 2021.10.28