안드로이드 앱 개발에서 데이터를 저장하는 방법은 여러 가지가 있으며, 그 중 하나가 파일 시스템을 활용하는 것입니다. 이 강좌에서는 자바를 이용해 안드로이드 앱에서 파일에 데이터를 저장하는 방법에 대해 자세히 설명하겠습니다. 주요 내용으로는 파일을 생성하고, 데이터를 쓰고 읽는 과정뿐만 아니라, 파일 입출력(I/O)과 관련된 주요 개념들을 다룰 것입니다.
1. 안드로이드 파일 시스템 개요
안드로이드에서는 데이터를 파일로 저장할 수 있는 여러 방법이 제공됩니다. 일반적으로 사용할 수 있는 파일 저장 방식은 내부 저장소와 외부 저장소 두 가지로 나눌 수 있습니다.
- 내부 저장소(Internal Storage): 애플리케이션이 설치된 기기 내의 앱 전용 공간에 데이터를 저장합니다. 다른 앱에서는 이 데이터를 접근할 수 없으며, 앱이 삭제되면 해당 데이터도 함께 삭제됩니다.
- 외부 저장소(External Storage): SD 카드와 같은 외부 저장 장치에 데이터를 저장합니다. 사용자가 직접 접근할 수 있으며, 다른 앱에서도 데이터를 공유할 수 있습니다. 외부 저장소는 다시 공개 저장소와 비공개 저장소로 나눌 수 있습니다.
2. 내부 저장소에 파일 저장하기
내부 저장소에 파일을 저장하는 과정은 다음과 같습니다.
2.1 파일 생성 및 쓰기
먼저, ‘MainActivity.java’ 파일을 열고, 내부 저장소에 데이터를 쓰기 위한 코드를 작성할 것입니다.
public class MainActivity extends AppCompatActivity {
private static final String FILENAME = "example_file.txt";
private Button writeButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
writeButton = findViewById(R.id.write_button);
writeButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
writeFileToInternalStorage("Hello, World!");
}
});
}
private void writeFileToInternalStorage(String data) {
FileOutputStream fos;
try {
fos = openFileOutput(FILENAME, Context.MODE_PRIVATE);
fos.write(data.getBytes());
fos.close();
Toast.makeText(this, "File saved successfully!", Toast.LENGTH_SHORT).show();
} catch (IOException e) {
e.printStackTrace();
Toast.makeText(this, "File write failed!", Toast.LENGTH_SHORT).show();
}
}
}
위 코드는 간단한 버튼 클릭 시 “Hello, World!”라는 텍스트를 내부 저장소에 ‘example_file.txt’라는 이름의 파일로 저장하는 예제입니다.
2.2 파일 읽기
저장한 파일을 읽기 위해 아래와 같은 코드를 추가합니다.
private void readFileFromInternalStorage() {
FileInputStream fis;
try {
fis = openFileInput(FILENAME);
InputStreamReader isr = new InputStreamReader(fis);
BufferedReader reader = new BufferedReader(isr);
StringBuilder sb = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
sb.append(line);
}
fis.close();
Toast.makeText(this, "Read from file: " + sb.toString(), Toast.LENGTH_SHORT).show();
} catch (IOException e) {
e.printStackTrace();
Toast.makeText(this, "File read failed!", Toast.LENGTH_SHORT).show();
}
}
이제 파일을 쓰고 나서 파일을 읽는 것이 가능합니다. 사용자가 버튼을 클릭하면 저장된 내용을 읽고, 화면에 Toast 메시지로 보여줍니다.
3. 외부 저장소에 파일 저장하기
외부 저장소에 파일을 저장하는 것은 내부 저장소와 약간 다르며, 사용자가 파일에 접근할 수 있습니다. 외부 저장소에 데이터를 저장하기 위해서는 먼저 권한을 요청해야 합니다.
3.1 권한 요청
AndroidManifest.xml 파일에 다음 코드를 추가하여 외부 저장소 접근 권한을 설정합니다.
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
이제 런타임 권한 요청을 위해 다음과 같은 코드를 ‘MainActivity.java’에 추가합니다.
private static final int REQUEST_EXTERNAL_STORAGE = 1;
private String[] permissions = {Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, permissions, REQUEST_EXTERNAL_STORAGE);
}
writeButton = findViewById(R.id.write_button);
writeButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
writeFileToExternalStorage("Hello from External Storage!");
}
});
}
3.2 파일 생성 및 쓰기
이제 외부 저장소에 파일을 생성하고 데이터를 쓸 수 있습니다. 외부 저장소에 파일을 쓰기 위한 코드는 다음과 같습니다.
private void writeFileToExternalStorage(String data) {
File file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS), "example_external_file.txt");
FileOutputStream fos;
try {
fos = new FileOutputStream(file);
fos.write(data.getBytes());
fos.close();
Toast.makeText(this, "External file saved successfully!", Toast.LENGTH_SHORT).show();
} catch (IOException e) {
e.printStackTrace();
Toast.makeText(this, "External file write failed!", Toast.LENGTH_SHORT).show();
}
}
위 코드는 외부 저장소의 문서 디렉토리에 ‘example_external_file.txt’라는 파일을 생성하고 “Hello from External Storage!”라는 데이터로 채웁니다.
3.3 파일 읽기
저장한 파일을 읽기 위한 코드는 다음과 같습니다.
private void readFileFromExternalStorage() {
File file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS), "example_external_file.txt");
FileInputStream fis;
try {
fis = new FileInputStream(file);
InputStreamReader isr = new InputStreamReader(fis);
BufferedReader reader = new BufferedReader(isr);
StringBuilder sb = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
sb.append(line);
}
fis.close();
Toast.makeText(this, "Read from external file: " + sb.toString(), Toast.LENGTH_SHORT).show();
} catch (IOException e) {
e.printStackTrace();
Toast.makeText(this, "External file read failed!", Toast.LENGTH_SHORT).show();
}
}
4. 추가적인 파일 처리 기능
파일 입출력을 다룰 때, 단순히 읽고 쓰는 것 외에도 몇 가지 추가적인 기능을 구현할 수 있습니다.
4.1 파일 존재 여부 확인
파일이 존재하는지 확인하는 코드는 다음과 같습니다.
private boolean fileExists(String fileName) {
File file = new File(getFilesDir(), fileName);
return file.exists();
}
4.2 파일 삭제
파일을 삭제하고자 할 경우, 아래의 코드를 사용합니다.
private void deleteFileFromInternalStorage(String fileName) {
File file = new File(getFilesDir(), fileName);
if (file.delete()) {
Toast.makeText(this, "File deleted successfully!", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(this, "File deletion failed!", Toast.LENGTH_SHORT).show();
}
}
5. 결론
이번 강좌에서는 자바를 사용하여 안드로이드 앱에서 파일에 데이터를 저장하는 방법에 대해 자세히 알아보았습니다. 내부 저장소와 외부 저장소를 활용하는 방법, 파일 생성 및 읽기, 권한 요청에 대한 사항들까지 폭넓게 다루었습니다.
데이터 저장이 필요한 다양한 애플리케이션에서 파일 시스템은 여전히 중요한 역할을 하고 있습니다. 이 강좌를 통해 파일 입출력에 대한 이해를 높이고, 실제 애플리케이션 개발에 적용할 수 있기를 바랍니다.
앞으로의 강좌에서는 데이터베이스와 같은 보다 복잡한 데이터 저장 방식에 대해서도 다룰 예정입니다. 파일 시스템과 함께 다양한 데이터 저장 방법을 익히고 적절히 활용할 수 있는 능력을 기르길 바랍니다.
감사합니다!