Notice
Recent Posts
Recent Comments
Link
투케이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///===========//: ================================================
반응형
'Android' 카테고리의 다른 글
Comments