안드로이드의 내부 저장소 매커니즘부터 시작해보자. 표준 자바 프로그래밍에 경험이 있는 사람이라면 이 절은 꽤나 친숙하게 느껴질 것이다.
안드로이드의 내부저장소는 단순히 각 애플리케이션의 내부 메모리와 관련된 파일을 읽고 쓸 수 있게 해준다. 이 파일은 애플리케이션에 의해
서만 접근 가능하며, 다른 애플리케이션이나 다른 사용자에 의해서는 접근이 불가능하다. 또한 애플리케이션이 삭제되면 저장돼 있던 파일
또한 자동으로 삭제된다.
다음은 애플리케이션의 내부 저장소에 접근하는 방법에 대한 간단한 예다.
package jwei.apps.dataforandroid.ch1;
import java.io.FileOutputStream;
import java.io.IOException;
import jwei.apps.dataforandroid.R;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
public class InternalStorageExample extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// 파일 이름
String fileName = "my_file.txt";
// 파일에 쓸 문자열
String msg = "Hello World.";
try {
// 파일 생성 후 쓰기
FileOutputStream fos = openFileOutput(fileName, Context.MODE_PRIVATE);
fos.write(msg.getBytes());
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
여기서는 단순히 Context 클래스의 openFileOutput() 메소드를 사용한다.
openFileOutput() 메소드는 첫 번째 인자로 생성될(혹은 덮어 쓸) 파일 이름을 받고, 두 번째 인자로 파일의 가시성을 받는다.
그 다음 원하는 문자열을 byte형태로 변환해 출력 스트림의 write() 메소드로 전달한다. openFileOutput() 으로 지정될 수 있는 부가적인
모드에 대해 살펴보자. 즉, 다음과 같다.
MODE_APPEND 이 모드는 기존 파일을 열어 문자열을 기존 내용에 추가(다름 모드에서는 기존 내용이 삭제된다)할 수 있게 해준다.
여러분이 이클립스로 프로그래밍을 하고 있다면 DDMS로 이동해 애플리케이션의 내부 파일을 살펴볼 수 있다.
따라서 방금 생성한 텍스트 파일을 볼 수 있을 것이다. 터미널로 개발하는 사람들은 /data/data/{앱 경로}/files/my_file.txt 경로에서 찾아볼 수 있다.
불행히도 다시 파일을 읽어오는 작업은 좀 더 복잡하다. 이와 관련된 코드는 다음과 비슷하다.
package jwei.apps.dataforandroid.ch1;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import jwei.apps.dataforandroid.R;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
public class InternalStorageExample2 extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// 파일 이름
String fileName = "my_file.txt";
try {
FileInputStream fis = openFileInput(fileName);
InputStreamReader isr = new InputStreamReader(fis);
// 임의의 길이로 문자열을 읽는다.
StringBuilder sb = new StringBuilder();
char[] inputBuffer = new char[2048];
int l;
// 버퍼에 데이터를 채운다.
while ((l = isr.read(inputBuffer)) != -1) {
sb.append(inputBuffer, 0, l);
}
// 바이트를 문자열로 변환한다.
String readString = sb.toString();
Log.i("LOG_TAG", "Read string: " + readString);
// 파일을 삭제할 수도 있다.
deleteFile(fileName);
} catch (IOException e) {
e.printStackTrace();
}
}
}
여기서 파일 입력 스트림을 열어 이를 스트림 리더에 전달했다. 이를 통해 read()메소드를 호출해 데이터를 바이트 형태로 읽어 StringBuyilder에 추가할
수 있었따. 내용 전체를 읽었다면 단순히 StringBuilder로부터 문자열을 반환한다. 그것이 전부다! 완전한 코드를 위해 마지막 부분에서 확인할 수 있듯이
Context 클래스는 내부 저장소에 저장된 파일을 삭제할 수 있는 간단한 메소드를 제공한다.
'Programing > Android' 카테고리의 다른 글
[SQL/DB] SQLite 데이터베이스 (0) | 2013.11.15 |
---|---|
[SQL/DB] 외부 저장소 메소드 (0) | 2013.11.15 |
[SQL/DB] SharedPreferences의 일반적인 사용 사례 (0) | 2013.11.15 |
[SQL/DB] SharedPreferences의 사용 (0) | 2013.11.13 |