오늘은 안드로이드 내부 저장소에 대해 알아보겠습니다. 안드로이드는 몇 가지 구조화된 방법으로 데이터를 저장할 수 있습니다. 이에는 데이터 저장을 위한 몇 가지 방법이 포함됩니다. 이에는
- 공유 설정
- 내부 저장소
- 외부 저장소
- SQLite 저장소
- 네트워크 연결을 통한 저장소(클라우드)가 있습니다.
이 튜토리얼에서는 안드로이드 내부 저장소를 사용하여 파일에 데이터를 저장하고 읽는 방법을 살펴보겠습니다.
안드로이드 내부 저장소
안드로이드 내부 저장소는 기기 메모리의 개인 데이터 저장소입니다. 기본적으로 내부 저장소에 파일을 저장하고 로드하는 것은 응용 프로그램에만 공개되며 다른 응용 프로그램은 이러한 파일에 액세스할 수 없습니다. 사용자가 응용 프로그램을 제거하면 응용 프로그램과 관련된 내부 저장된 파일도 제거됩니다. 그러나, 일부 사용자는 안드로이드 폰을 루팅하여 최고 관리자 액세스를 얻습니다. 이러한 사용자는 원하는 파일을 읽고 쓸 수 있습니다.
안드로이드 내부 저장소에서 텍스트 파일 읽고 쓰기
안드로이드는 로컬 파일로부터 읽고 쓰는 스트림을 수정하기 위해 Java I/O 클래스에서 openFileInput
와 openFileOutput
을 제공합니다.
-
openFileOutput(): 이 메서드는 파일을 생성하고 저장하는 데 사용됩니다. 문법은 다음과 같습니다:
FileOutputStream fOut = openFileOutput("파일명", Context.MODE_PRIVATE);
openFileOutput()
메서드는FileOutputStream
의 인스턴스를 반환합니다. 그 후 파일에 데이터를 쓰기 위해 write 메서드를 호출할 수 있습니다. 문법은 다음과 같습니다:String str = "테스트 데이터"; fOut.write(str.getBytes()); fOut.close();
-
openFileInput(): 이 메서드는 파일을 열고 읽는 데 사용됩니다. FileInputStream의 인스턴스를 반환합니다. 아래는 그 구문입니다:
FileInputStream fin = openFileInput(file);
이후에는 파일에서 한 번에 한 문자씩 읽고 인쇄하는 read 메서드를 호출합니다. 아래는 그 구문입니다:
int c; String temp=""; while( (c = fin.read()) != -1){ temp = temp + Character.toString((char)c); } fin.close();
위의 코드에서 문자열 temp에는 파일의 모든 데이터가 포함됩니다.
-
이러한 메서드는 파일 경로(e.g. path/to/file.txt)를 허용하지 않습니다. 단순한 파일 이름만 허용합니다.
Android 내부 저장소 프로젝트 구조
Android 내부 저장소 예제 코드
XML 레이아웃에는 파일에 데이터를 작성하기 위한 EditText
와 Write 버튼 및 Read 버튼이 포함되어 있습니다. onClick
메서드는 다음과 같이 XML 파일에만 정의됩니다: activity_main.xml
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
xmlns:tools="https://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentRight="true"
android:padding="5dp"
android:text="Android Read and Write Text from/to a File"
android:textStyle="bold"
android:textSize="28sp" />
<EditText
android:id="@+id/editText1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentRight="true"
android:layout_below="@+id/textView1"
android:layout_marginTop="22dp"
android:minLines="5"
android:layout_margin="5dp">
<requestFocus />
</EditText>
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Write Text into File"
android:onClick="WriteBtn"
android:layout_alignTop="@+id/button2"
android:layout_alignRight="@+id/editText1"
android:layout_alignEnd="@+id/editText1" />
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Read Text From file"
android:onClick="ReadBtn"
android:layout_centerVertical="true"
android:layout_alignLeft="@+id/editText1"
android:layout_alignStart="@+id/editText1" />
</RelativeLayout>
MainActivity
에는 파일에 쓰기 및 읽기의 구현이 포함되어 있습니다. 이는 위에서 설명한 대로입니다.
package com.journaldev.internalstorage;
import android.os.Bundle;
import android.app.Activity;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class MainActivity extends Activity {
EditText textmsg;
static final int READ_BLOCK_SIZE = 100;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textmsg=(EditText)findViewById(R.id.editText1);
}
// 파일에 텍스트 쓰기
public void WriteBtn(View v) {
// 파일에 텍스트 추가 쓰기
try {
FileOutputStream fileout=openFileOutput("mytextfile.txt", MODE_PRIVATE);
OutputStreamWriter outputWriter=new OutputStreamWriter(fileout);
outputWriter.write(textmsg.getText().toString());
outputWriter.close();
// 파일 저장 메시지 표시
Toast.makeText(getBaseContext(), "File saved successfully!",
Toast.LENGTH_SHORT).show();
} catch (Exception e) {
e.printStackTrace();
}
}
// 파일에서 텍스트 읽기
public void ReadBtn(View v) {
// 파일에서 텍스트 읽기
try {
FileInputStream fileIn=openFileInput("mytextfile.txt");
InputStreamReader InputRead= new InputStreamReader(fileIn);
char[] inputBuffer= new char[READ_BLOCK_SIZE];
String s="";
int charRead;
while ((charRead=InputRead.read(inputBuffer))>0) {
// 문자열 변환
String readstring=String.copyValueOf(inputBuffer,0,charRead);
s +=readstring;
}
InputRead.close();
textmsg.setText(s);
} catch (Exception e) {
e.printStackTrace();
}
}
}
여기서, 데이터가 내부 저장소에 성공적으로 작성되면 토스트가 표시되며, 파일에서 데이터를 읽으면 EditText 자체에 데이터가 표시됩니다. 아래 이미지는 프로젝트의 결과물입니다. 이미지는 내부 저장소에 텍스트가 작성되고 Read를 클릭하면 동일한 EditText에 텍스트가 다시 표시됩니다.
파일은 어디에 있습니까?
실제 파일을 보려면 도구->Android->Android Device Monitor에서 Android Device Monitor를 엽니다. 파일은 아래 이미지에 표시된대로 폴더 data->data->{패키지 이름}->files에 있습니다. 파일 “mytextfile.txt”은 프로젝트의 패키지 이름인 com.journaldev.internalstorage에 있습니다. 아래에 표시된 것처럼 최종 프로젝트를 다운로드하세요.
안드로이드 내부 저장소 예제를 아래 링크에서 다운로드하세요.
Source:
https://www.digitalocean.com/community/tutorials/android-internal-storage-example-tutorial