본문 바로가기
안드로이드 자바

[JAVA][Android] 안드로이드에서 파일 읽고 쓰기

by teamnova 2024. 8. 30.
728x90

안드로이드 앱 개발을 하다 보면 파일을 읽고 쓰는 기능이 필요할 때가 많습니다. 예를 들어, 사용자가 입력한 데이터를 저장하거나, 설정 파일을 저장하고 읽어오는 등의 작업을 수행할 때입니다. 이번 포스팅에서는 안드로이드에서 파일을 읽고 쓰는 기본적인 방법에 대해 알아보겠습니다.

 

안드로이드에서 파일 시스템은 크게 두 가지로 나눌 수 있습니다:

  • 내부 저장소 (Internal Storage): 앱 전용의 저장 공간입니다. 앱이 삭제되면 이 공간에 저장된 데이터도 함께 삭제됩니다. 보안이 필요한 데이터를 저장할 때 사용됩니다.
  • 외부 저장소 (External Storage): 일반적으로 사용자가 접근할 수 있는 저장 공간입니다. 사진, 동영상 등과 같은 데이터를 저장할 때 주로 사용됩니다.

내부 저장소는 앱의 전용 영역으로, 다른 앱이 접근할 수 없습니다. 반면 외부 저장소는 다른 앱과 공유할 수 있는 공간입니다. 이번 포스팅에서는 보안이 강화된 내부 저장소를 사용해 파일을 읽고 쓰는 방법을 알아보겠습니다.

 

전체 코드입니다.

 

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="16dp">

    <EditText
        android:id="@+id/editText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="입력해주세요" />

    <Button
        android:id="@+id/saveButton"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="저장하기" />

    <Button
        android:id="@+id/loadButton"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="불러오기" />

    <TextView
        android:id="@+id/textView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:paddingTop="16dp"
        android:hint="이곳에 나타납니다" />

</LinearLayout>

 

 

MainActivity.java

package com.example.mytestapp1;

import android.content.Context;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;

public class MainActivity extends AppCompatActivity {

  private EditText editText;
  private TextView textView;
  private final String filename = "memo.txt";


  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    editText = findViewById(R.id.editText);
    textView = findViewById(R.id.textView);
    Button saveButton = findViewById(R.id.saveButton);
    Button loadButton = findViewById(R.id.loadButton);

    saveButton.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        String text = editText.getText().toString();
        saveToFile(text);
      }
    });

    loadButton.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        String text = loadFromFile();
        textView.setText(text);
      }
    });
  }

  private void saveToFile(String text) {
    try (FileOutputStream fos = openFileOutput(filename, Context.MODE_PRIVATE)) {
      fos.write(text.getBytes());
    } catch (IOException e) {
      e.printStackTrace();
    }
  }

  private String loadFromFile() {
    StringBuilder fileContents = new StringBuilder();

    try (FileInputStream fis = openFileInput(filename)) {
      InputStreamReader inputStreamReader = new InputStreamReader(fis);
      BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
      String line;
      while ((line = bufferedReader.readLine()) != null) {
        fileContents.append(line);
      }
    } catch (IOException e) {
      e.printStackTrace();
    }

    return fileContents.toString();
  }

}

 

위 코드는 사용자가 EditText에 입력한 텍스트를 "저장하기" 버튼으로 저장하고, "불러오기" 버튼으로 불러오는 간단한 메모장 앱입니다.

 

파일 쓰기 (saveToFile 메서드)

FileOutputStream을 사용하여 내부 저장소에 텍스트 파일(memo.txt)을 엽니다. Context.MODE_PRIVATE 모드는 파일이 앱 내부에서만 사용될 수 있도록 설정합니다.

사용자가 입력한 텍스트를 바이트 배열로 변환하고 fos.write() 메서드를 사용하여 파일에 기록합니다.

 

파일 읽기 (loadFromFile 메서드)

FileInputStream을 사용하여 내부 저장소에서 텍스트 파일(memo.txt)을 엽니다.

InputStreamReader와 BufferedReader를 사용하여 파일에서 데이터를 읽어옵니다. 데이터를 한 줄씩 읽어 StringBuilder에 추가하고, 마지막에 String으로 변환하여 반환합니다.

 

 

시연 영상 입니다.