mojo's Blog

파일 처리 및 응용 본문

Android

파일 처리 및 응용

_mojo_ 2021. 8. 31. 14:47

앱을 종료했다가 다음에 다시 실행할 때 사용했던 곳부터 이어서 작업하고 싶은 경우가 있다.

이럴 때 내장 메모리에 파일을 저장하고 읽어오는 방식이 쓰인다.

내장 메모리의 저장 위치는 /data/data/패키지명/files 폴더이다.

 

파일을 읽기 위해 먼저 안드로이드 Context 클래스의 openFileInput() 메소드를 사용하는데, 이 메소드는 FileInputStream 을 반환한다.

파일을 쓰기 위해서 openFileOutput() 메소드를 사용하면 FileOutputStream 을 반환한다.

Java에서 제공하는 파일을 읽고 쓰는 java.io.FileInputStream 클래스와 java.io.FileOutputStream 의 read(), write() 메소드를 사용하여 파일을 처리한다.

내장 메모리에서의 파일 처리 과정은 다음과 같다.

 

  1. openFileOutput(), openFileInput() 으로 파일을 열기
  2. read() 또는 write()로 파일 읽기/쓰기
  3. 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
Comments