mojo's Blog
파일 처리 및 응용 본문
앱을 종료했다가 다음에 다시 실행할 때 사용했던 곳부터 이어서 작업하고 싶은 경우가 있다.
이럴 때 내장 메모리에 파일을 저장하고 읽어오는 방식이 쓰인다.
내장 메모리의 저장 위치는 /data/data/패키지명/files 폴더이다.
파일을 읽기 위해 먼저 안드로이드 Context 클래스의 openFileInput() 메소드를 사용하는데, 이 메소드는 FileInputStream 을 반환한다.
파일을 쓰기 위해서 openFileOutput() 메소드를 사용하면 FileOutputStream 을 반환한다.
Java에서 제공하는 파일을 읽고 쓰는 java.io.FileInputStream 클래스와 java.io.FileOutputStream 의 read(), write() 메소드를 사용하여 파일을 처리한다.
내장 메모리에서의 파일 처리 과정은 다음과 같다.
- openFileOutput(), openFileInput() 으로 파일을 열기
- read() 또는 write()로 파일 읽기/쓰기
- close()로 파일을 닫기
파일을 쓰고 읽는 연습을 해본다.
activity_main.xml Code
<?xml version="1.0" encoding="utf-8"?>
<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"
android:padding="10dp">
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/btn1"
android:text="내장 메모리에 파일 쓰기"/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/btn2"
android:text="내장 메모리에서 파일 읽기"/>
</LinearLayout>
Java Code
public class MainActivity extends AppCompatActivity {
Button btn1, btn2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setTitle("연습하기");
btn1 = (Button)findViewById(R.id.btn1);
btn2 = (Button)findViewById(R.id.btn2);
btn1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
try{
FileOutputStream outFs = openFileOutput("file.txt", Context.MODE_PRIVATE);
String str = "안드로이드";
outFs.write(str.getBytes());
outFs.close();
Toast.makeText(getApplicationContext(), "file.txt 가 생성됨",Toast.LENGTH_SHORT).show();
} catch(IOException e){ }
}
});
btn2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
try{
FileInputStream inFs = openFileInput("file.txt");
byte[] txt = new byte[30];
inFs.read(txt);
String str = new String(txt);
Toast.makeText(getApplicationContext(),str,Toast.LENGTH_SHORT).show();
inFs.close();
} catch(IOException e){ }
}
});
}
}
연습 ) 간단한 일기장 앱을 만들어 보기
activity_main.xml Code
<?xml version="1.0" encoding="utf-8"?>
<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">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:orientation="vertical"
android:gravity="center">
<DatePicker
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:calendarViewShown="false"
android:id="@+id/datePicker"/>
</LinearLayout>
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/edit1"
android:background="#00ff00"
android:lines="8"/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="새로 저장"
android:enabled="false"
android:id="@+id/btn1"/>
</LinearLayout>
Java Code
public class MainActivity extends AppCompatActivity {
DatePicker datePicker;
EditText edit;
Button btn;
String fileName;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setTitle("연습하기");
datePicker = (DatePicker)findViewById(R.id.datePicker);
edit = (EditText) findViewById(R.id.edit1);
btn = (Button)findViewById(R.id.btn1);
Calendar cal = Calendar.getInstance();
int cYear = cal.get(Calendar.YEAR);
int cMonth = cal.get(Calendar.MONTH);
int cDay = cal.get(Calendar.DAY_OF_MONTH);
datePicker.init(cYear, cMonth, cDay, new DatePicker.OnDateChangedListener() {
@Override
public void onDateChanged(DatePicker datePicker, int year, int month, int day) {
fileName = Integer.toString(year)+"_"+Integer.toString(month)+"_"+Integer.toString(day);
String str = readDiary(fileName);
edit.setText(str);
btn.setEnabled(true);
}
});
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
try{
FileOutputStream outFs = openFileOutput(fileName, Context.MODE_PRIVATE);
String str = edit.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);
btn.setText("수정하기");
} catch(IOException e){
edit.setHint("일기 없음");
btn.setText("새로 저장");
}
return diaryStr;
}
}
파일을 직접 확인하기
1. [View] - [Tool Windows] - [Device File Explorer] 를 선택한다.
2. Device File Explorer 화면에서 [data] - [data] - [com.example.현재 프로젝트이름] 을 클릭한다.
3. 확인하고 싶은 파일을 클릭해본다.
특정 폴더의 하위 폴더 및 파일 목록
XML Code
<?xml version="1.0" encoding="utf-8"?>
<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">
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="시스템 폴더의 폴더/파일 목록"
android:id="@+id/btn1"/>
<EditText
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/edit1" />
</LinearLayout>
Java Code
public class MainActivity extends AppCompatActivity {
Button btn1;
EditText edit;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setTitle("연습하기");
btn1 = (Button)findViewById(R.id.btn1);
edit = (EditText)findViewById(R.id.edit1);
btn1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String sysDir = Environment.getRootDirectory().getAbsolutePath();
File[] sysFiles = (new File(sysDir).listFiles());
String strFname;
for(int i=0; i<sysFiles.length; i++) {
if (sysFiles[i].isDirectory() == true)
strFname = "<폴더> " + sysFiles[i].toString();
else
strFname = "<파일> " + sysFiles[i].toString();
edit.setText(edit.getText()+"\n"+strFname);
}
}
});
}
}
연습하기 ) 간단한 이미지 뷰어 만들기
activity_main.xml Code
<?xml version="1.0" encoding="utf-8"?>
<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">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:id="@+id/btnPrev"
android:text=" 이전 그림 "/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:id="@+id/btnNext"
android:text=" 다음 그림 "/>
</LinearLayout>
<com.example.helloandroid.myPictureView
android:id="@+id/myPictureView1"
android:layout_height="300dp"
android:layout_width="300dp"
android:layout_gravity="center"/>
</LinearLayout>
myPictureView Java Code
public class myPictureView extends View {
String imagePath = null;
public myPictureView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}
protected void onDraw(Canvas canvas){
super.onDraw(canvas);
if(imagePath != null){
Bitmap bitmap = BitmapFactory.decodeFile(imagePath);
canvas.drawBitmap(bitmap, 250, 200, null);
bitmap.recycle();
}
}
}
MainActivity Java Code
public class MainActivity extends AppCompatActivity {
Button btnPrev, btnNext;
myPictureView myPicture;
int curNum;
File[] imageFiles;
String imageFname;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setTitle("연습하기");
ActivityCompat.requestPermissions(this, new String[]
{Manifest.permission.WRITE_EXTERNAL_STORAGE}, MODE_PRIVATE);
btnPrev = (Button)findViewById(R.id.btnPrev);
btnNext = (Button)findViewById(R.id.btnNext);
myPicture = (myPictureView)findViewById(R.id.myPictureView1);
imageFiles = new File(Environment.getExternalStorageDirectory().getAbsolutePath()+"/Pictures").listFiles();
imageFname = imageFiles[0].toString();
myPicture.imagePath = imageFname;
btnPrev.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if(curNum<=0){
Toast.makeText(getApplicationContext(), "첫 번째 그림입니다.", Toast.LENGTH_SHORT).show();
} else {
curNum--;
imageFname = imageFiles[curNum].toString();
myPicture.imagePath = imageFname;
myPicture.invalidate();
}
}
});
btnNext.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if(curNum >= imageFiles.length-1){
Toast.makeText(getApplicationContext(), "마지막 그림입니다.", Toast.LENGTH_SHORT).show();
} else {
curNum++;
imageFname = imageFiles[curNum].toString();
myPicture.imagePath = imageFname;
myPicture.invalidate();
}
}
});
}
}
'Android' 카테고리의 다른 글
Graphic (0) | 2021.09.02 |
---|---|
안드로이드 프로그래밍 제 8장 연습문제 6번 (0) | 2021.08.31 |
안드로이드 프로그래밍 제 7장 연습문제 (4, 5, 6번) (0) | 2021.08.30 |
대화상자 (0) | 2021.08.30 |
메뉴 (0) | 2021.08.30 |