파일에 읽고 쓰기 완벽정리

 

자바 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파일을 만들고, 그 파일에 문자열 데이터를 쓰는 예이다.