파일에 읽고 쓰기 완벽정리
자바 API를 그대로 사용, java.io패키지의 클래스들을 이용해서 작성한다.
File : 파일 및 디렉터리를 지칭하는 클래스
FileInputStream : 파일에서 바이트 데이터를 읽기 위한 함수 제공
FileOutputStream : 파일에 바이트 데이터를 쓰기 위한 함수 제공
FileReader : 파일에서 문자열 데이터를 읽기 위한 함수 제공
내부 저장 공간은 앱을 설치할 때 해당 앱을 위한 공간이 할당되고, 해당 앱에서만 접근 가능. 앱이 삭제될 때 함께 제거됨.
외부 저장 공간은 사용자가 임의로 장착/제거할 수 있기 때문에 먼저 사용할 수 있는지를 확인하는 코드가 필요!
Environment.getExternalStorageState() : 외부 저장 공간 상태
Environment.getExternalStorageDirectory().getAbsolutePath() : 외부 저장 공간 경로
Environment.getDataDirectory().getAbsolutePath() : 내부 저장 공간 경로
è 경로는 스마트폰마다 다를 수 있으므로 문자열 지정 말고 위 함수를 이용한다.
1. 외부 저장 공간 이용
스마트폰에서 외부 저장 공간을 제공하는지?
판단하는 코드
String state = Environment.getExternalStorageState(); à 이 함수의 반환값이
If(state.equals(Environment.MEDIA_MOUNTED)) { à 이면! 외부 저장 공간이 제공된다는 뜻
If(state.equals(Environment.MEDIA_MOUNTED_READ_ONLY)) { à 읽기 전용인가?
externalStorageReadable = true;
externalStorageWritable = false; à 읽기는 되고 쓰기는 안 됨.
} else {
externalStorageReadable = true;
externalStorageWritable = true;
}
}else { à MOUNTED가 아니면?
externalStorageReadable = externalStorageWritable = false; à 읽고 쓰기 둘 다 안 됨
}
이제 실제 외부 저장 공간에 작업을 해야 하는데, 퍼미션 사용 설정을 manifest에 해놔야 한다.
<uses-permission android:name = “android.permission.WRITE_EXTERNAL_STORAGE” />
<uses-permission android:name = “android.permission.READ_EXTERNAL_STORAGE” />
이제 본격적인 코드 작성.
외부 저장 공간에 myApp이라는 폴더를 만들고 그 하위에 myfile.txt라는 파일을 만들어 문자열 데이터를 저장해 보자.
FileWriter writer;
try {
// 외부 저장 공간 root 하위에 myApp이라는 폴더 경로 획득
String dirPath = Environment.getExternalStorageDirectory().getAbsolutePath() + “/myApp”;
File dir = new File(dirPath); // 객체 생성
if(!dir.exists()){ // 폴더가 없으면
dir.mkdir(); // 만들어 준다.
}
// myApp 폴더 밑에 myfile.txt 파일 지정
File file = new File(dir+”/myfile.txt”);
if(!file.exists()){ // 파일이 없다면
file.createNewFile(); // 새로 만들어 준다.
}
// 파일에 쓰기
writer = new FileWriter(file, true);
writer.write(content);
writer.flush();
writer.close();
} catch (Exception e) {
e.printStackTrace();
}
è 문자열 데이터를 저장하기 위해 FileWriter를 썼다. 이미지 등의 바이트 데이터를 저장하려면 OutputStream 클래스를 사용한다. 그런데! 파일 여러 개 저장할 때 파일명 중복 문제가 발생하는데 해결 방법은 두 가지다. 개발자가 알고리즘으로 해결, 자바 API에서 제공하는 함수를 이용.
File tempFile = File.createTempFile(“IMG”, “.jpg”, dir);
위의 createTempFile() 함수는 자동으로 파일명을 중복 없이 부여한다. 1번 매개변수는 파일명의 접두어, 2번 매개변수는 파일 확장자.
File file1 = new file(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), “a.jpg”);
위의 getExternalStoragePublicDirectory() 함수는 스마트폰에 설정된 공용 폴더의 경로를 전달해 준다. 실제 경로는 폰마다 다르고 위 코드는 이미지 저장용 공용 폴더를 획득한 예이다.
Environment.DIRECTORY_ALARMS : 알람으로 쓸 오디오 파일 저장 폴더
Environment.DIRECTORY_DCIM : 카메라로 촬영한 사진 저장 폴더
Environment.DIRECTORY_DOWNLOADS : 다운로드한 파일 저장 폴더
Environment.DIRECTORY_MUSIC : 음악 파일 저장 폴더
Environment.DIRECTORY_MOVIES : 영상 파일 저장 폴더
Environment.DIRECTORY_NOTIFICATIONS : 알림음으로 쓸 오디오 파일 저장 폴더
Environment.DIRECTORY_PICTURES : 이미지 파일 저장 폴더
이번엔 외부 저장 공간의 파일을 읽기 위한 코드.
myApp 폴더의 myfile.txt 파일을 읽어서 StringBuffer 객체에 저장하는 예이다.
file = new File(Environment.getExternalStorageDirectory()
.getAbsolutePath()+ “/myApp/myfile.txt”);
}
try {
BufferedReader reader = new BufferReader(new FileReader(file));
StringBuffer buffer = new StringBuffer();
String line;
While ((line=reader.readLine()) != null){
Buffer.append(line);
}
Reader.close();
} catch (Exception e){
e.printStackTrace();
}
2. 내부 저장 공간 이용
내부 저장 공간에 저장하려면 해당 경로를 얻어야 한다. getFileDir()함수로 얻을 수 있다. 다음은 getFileDir() 함수로 앱의 내부 저장 공간에 myfile.txt파일을 만들고, 그 파일에 문자열 데이터를 쓰는 예이다.
'개발자 지식 > 안드로이드' 카테고리의 다른 글
[안드로이드] 앱바레이아웃(appbarlayout) 정리 (0) | 2020.09.11 |
---|---|
[안드로이드] 프래그먼트 완벽정리 (0) | 2020.09.11 |
[안드로이드] 탭레이아웃, 뷰페이저, 리사이클러 뷰 예제 해설 (0) | 2020.09.11 |
[안드로이드] 인텐트(intent) 완전 정복 (0) | 2020.09.11 |
[안드로이드] 배경 색깔 변경하기 (setBackgroundColor) (0) | 2020.09.11 |