[안드로이드]파일처리

내장메모리 파일 처리

  • 앱을 종료했다가 다시 실행할때 작업했던 부분에서 이어서 작업하고 싶은 경우에 사용한다.
  • 내장메모리의 위치 : /data/data/패키지명/files폴더
  • 파일읽기 : openFileInput() 메소드 사용 -> FileInputStream을 반환한다. -> write()메소드사용
  • 파일쓰기 : openFileOutput() 메소드 사용 -> FileOutputStream을 반환한다. -> read()메소드사용
  • 파일기반 입/출력처리 스트림이란
  • 일반적인 절차
    1. openFileInput()와 openFileOutput()로 파일열기 ->
    2. write()와 read()로 파일 읽기/쓰기
    3. close()로 꼭 닫기




간단한 다이어리 만들기예시

activity_main.xml코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<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">

<DatePicker
android:id="@+id/datepicker"
android:calendarViewShown="false"
android:datePickerMode="spinner"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
<EditText
android:id="@+id/edtdiary"
android:background="@android:color/holo_blue_light"
android:lines="8"
android:textColor="@android:color/white"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/btnw"
android:enabled="false"
android:text="다이어리쓰기"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>

MainActivity.java 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
public class MainActivity extends AppCompatActivity {

DatePicker dp;
EditText edtDiary;
Button btnWrite;
String fileName;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setTitle("간단한 일기장");

dp = (DatePicker) findViewById(R.id.datepicker);
edtDiary = (EditText) findViewById(R.id.edtdiary);
btnWrite = (Button) findViewById(R.id.btnw);

Calendar cal = Calendar.getInstance();
int cYear = cal.get(Calendar.YEAR);
int cMonth = cal.get(Calendar.MONTH);
int cDay = cal.get(Calendar.DAY_OF_MONTH);

dp.init(cYear, cMonth, cDay, new DatePicker.OnDateChangedListener() {
public void onDateChanged(DatePicker view, int year,
int monthOfYear, int dayOfMonth) {
fileName = Integer.toString(year) + "_"
+ Integer.toString(monthOfYear + 1) + "_"
+ Integer.toString(dayOfMonth) + ".txt";
String str = readDiary(fileName);
edtDiary.setText(str);
btnWrite.setEnabled(true);
}
});

//다이어리쓰기
btnWrite.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try{
FileOutputStream outfs = openFileOutput(fileName, Context.MODE_PRIVATE);
String str = edtDiary.getText().toString();
outfs.write(str.getBytes());
outfs.close();
Toast.makeText(getApplicationContext(), fileName+"이 저장됨", Toast.LENGTH_SHORT).show();
}catch(IOException e){ }
}
});
}

//일기내용읽어서 반환
String readDiary(String fName){
String diaryStr = null;
FileInputStream infs;
try{
infs = openFileInput(fName);
byte[] txt = new byte[500];
infs.read(txt);
infs.close();
diaryStr = (new String(txt)).trim();
btnWrite.setText("일기 수정하기");
}catch(IOException e){
edtDiary.setHint("일기를 쓰세요");
btnWrite.setText("새로운 일기 저장");
}
return diaryStr;
}
}




sd카드

  • 읽기 전용 파일의 경우 프로젝트의 /res/raw폴더를 사용한다.
  • 텍스트가 아닌 음악, 영상, 그림파을 등 응용프로그램은 안드로이드 SD카드에 저장하여 읽을 수 있다.
  • Device File Explorer에서 /sdcard 폴더 또는 /storage/emulator/0 폴더에 파일을 업도르하면 SD카드에 저장 된다.