투케이2K

440. (android/java) [android 12 / target 31] File getExternalFilesDir 사용해 텍스트 파일 읽기 및 쓰기 실시 본문

Android

440. (android/java) [android 12 / target 31] File getExternalFilesDir 사용해 텍스트 파일 읽기 및 쓰기 실시

투케이2K 2023. 1. 3. 06:51

[개발 환경 설정]

개발 툴 : AndroidStudio

 

[소스 코드]

    // [func 함수 정의 : 기능 테스트]
    public static void func(Context mContext) {
        Log.i("---","---");
        Log.d("//===========//","================================================");
        Log.i("","\n"+"[A_Test >> func() :: start]");
        Log.d("//===========//","================================================");
        Log.i("---","---");


        // [로직 처리 실시]
        try {

            /**
             * // -----------------------------------------
             * [요약 설명]
             * // -----------------------------------------
             * 1. 필요 권한 설정 [안드로이드 타겟 sdk 버전 31 기준] :
             *
             * <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
             * <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
             *
             * // [저장소 권한 : application >> android:requestLegacyExternalStorage="true" 등록 필요]
             *
             * // -----------------------------------------
             * 2. 로직 설명 :
             *
             * - 사용자에게 외부 저장소 읽기 , 쓰기 권한 요청 실시
             *
             * - 마운트 상태 및 읽기 전용 여부 체크
             *
             * - File 저장된 경로 존재 여부 확인 및 쓰기, 읽기 수행
             *
             * // -----------------------------------------
             * 3. 참고 사이트 :
             *
             * https://www.digitalocean.com/community/tutorials/android-external-storage-read-write-save-file
             *
             * https://velog.io/@eia51/Android-%EC%A0%80%EC%9E%A5%EC%86%8C-%EA%B4%80%EB%A6%AC
             * // -----------------------------------------
             * 4. 개별 앱 공간 특징 :
             *
             * - 앱이 삭제 되면 같이 지워집니다
             * - 접근 권한이 필요합니다
             * - 내부 저장소에 저장 할 수 없는 대용량 데이터를 저장 가능합니다
             * - 다른 앱에서는 접근 할 수 없습니다
             * // -----------------------------------------
             * */


            // [Environment 외부 저장소 getExternalStorageState 상태 체크 실시]
            String extStorageState = Environment.getExternalStorageState();


            // [마운트 상태 체크 실시]
            boolean checkMount = false;
            if (Environment.MEDIA_MOUNTED.equals(extStorageState) == true){
                checkMount = true;
            }


            // [Environment 외부 저장소가 읽기 전용이 아닌지 체크]
            boolean checkRead = false;
            if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(extStorageState) == true){
                checkRead = true;
            }


            // [로그 출력 실시]
            Log.i("---","---");
            Log.d("//===========//","================================================");
            Log.i("","\n"+"[A_Test >> func() :: extStorageState 상태 확인]");
            Log.i("","\n"+"[마운트 상태 :: "+String.valueOf(checkMount)+"]");
            Log.i("","\n"+"[읽기 전용 확인 :: "+String.valueOf(checkRead)+"]");
            Log.d("//===========//","================================================");
            Log.i("---","---");


            // [파일 읽기 및 쓰기 할 경로 지정 실시]
            String filePath = "twok_file_path";
            String fileName = "twok.txt";


            // [로직 분기 처리]
            if (checkMount == true && checkRead == false){ // [마운트가 되어 있고, 읽기 전용이 아닌 경우]
                Log.i("---","---");
                Log.d("//===========//","================================================");
                Log.i("","\n"+"[A_Test >> func() :: 파일 저장 경로 및 정보 확인]");
                Log.i("","\n"+"[공용 공간 :: "+String.valueOf(Environment.getExternalStorageDirectory().getPath())+"]");
                Log.i("","\n"+"[개별 앱 공간 :: "+String.valueOf(mContext.getExternalFilesDir(null))+"]");
                Log.i("","\n"+"[저장 할 공간 :: "+String.valueOf(mContext.getExternalFilesDir(filePath))+"]");
                Log.i("","\n"+"[filePath :: "+String.valueOf(filePath)+"]");
                Log.i("","\n"+"[fileName :: "+String.valueOf(fileName)+"]");
                Log.d("//===========//","================================================");
                Log.i("---","---");

                // [File 선언 실시]
                File myExternalFile = new File(mContext.getExternalFilesDir(filePath), fileName);
                
                if (myExternalFile.exists() == true){ // [파일이 존재하는 경우]
                    Log.i("---","---");
                    Log.d("//===========//","================================================");
                    Log.i("","\n"+"[A_Test >> func() :: 파일 저장 경로 존재 함 >> 파일 읽기 실시]");
                    Log.d("//===========//","================================================");
                    Log.i("---","---");

                    try {
                        String data = "";

                        FileInputStream fis = new FileInputStream(myExternalFile);
                        DataInputStream in = new DataInputStream(fis);
                        BufferedReader br = new BufferedReader(new InputStreamReader(in));
                        String strLine;
                        while ((strLine = br.readLine()) != null) {
                            data = data + strLine;
                        }
                        in.close();

                        Log.i("---","---");
                        Log.w("//===========//","================================================");
                        Log.i("","\n"+"[A_Test >> func() :: 파일 읽기 완료]");
                        Log.i("","\n"+"[data :: "+String.valueOf(data)+"]");
                        Log.w("//===========//","================================================");
                        Log.i("---","---");

                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                else { // [파일이 존재하지 않는 경우]
                    Log.i("---","---");
                    Log.d("//===========//","================================================");
                    Log.i("","\n"+"[A_Test >> func() :: 파일 저장 경로 존재 하지 않음 >> 파일 생성 실시]");
                    Log.d("//===========//","================================================");
                    Log.i("---","---");

                    try {
                        String data = "hello twok";

                        FileOutputStream fos = new FileOutputStream(myExternalFile);
                        fos.write(data.getBytes());
                        fos.close();

                        Log.i("---","---");
                        Log.w("//===========//","================================================");
                        Log.i("","\n"+"[A_Test >> func() :: 파일 생성 완료]");
                        Log.w("//===========//","================================================");
                        Log.i("---","---");

                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
            else {
                Log.i("---","---");
                Log.e("//===========//","================================================");
                Log.i("","\n"+"[A_Test >> func() :: File Create Error]");
                Log.e("//===========//","================================================");
                Log.i("---","---");
            }
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }
 

[결과 출력]

 

D///===========//: ================================================
I/: [A_Test >> func() :: start]
D///===========//: ================================================

D///===========//: ================================================
I/: [A_Test >> func() :: extStorageState 상태 확인]
I/: [마운트 상태 :: true]
I/: [읽기 전용 확인 :: false]
D///===========//: ================================================

D///===========//: ================================================
I/: [A_Test >> func() :: 파일 저장 경로 및 정보 확인]
I/: [공용 공간 :: /storage/emulated/0]
I/: [개별 앱 공간 :: /storage/emulated/0/Android/data/com.example.javaproject/files]
I/: [저장 할 공간 :: /storage/emulated/0/Android/data/com.example.javaproject/files/twok_file_path]
I/: [filePath :: twok_file_path]
I/: [fileName :: twok.txt]
D///===========//: ================================================

D///===========//: ================================================
I/: [A_Test >> func() :: 파일 저장 경로 존재 함 >> 파일 읽기 실시]
D///===========//: ================================================

W///===========//: ================================================
I/: [A_Test >> func() :: 파일 읽기 완료]
I/: [data :: hello twok]
W///===========//: ================================================

반응형
Comments