ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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
        }
    }

     

     

    실행결과

     

     

     

     

    완성^^~~~~~

    반응형

    댓글

Designed by Tistory.