본문 바로가기
Android 개발/File IO, FilesDir, Storage,

Android 에서 File 저장하기 Part1. Internal Storage 편

by Developer88 2017. 1. 8.
반응형

안드로이드에서 이미지 캐쉬파일이나 DB파일등을 저장할 필요가 있는데요.
이 때 파일을 저장하는 방법에 대해서 정리해보겠습니다.

 

1. Android의 파일저장공간

안드로이드는 파일을 어디에 저장할 수 있을까요?

 

안드로이드에서의 파일저장공간은 크게 두가지로 나뉘어 지는데요.
internal(내부)과 external(외부) 두가지입니다. 


이것은 안드로이드 초기부터 microSD카드를 확장할 수 있도록 
내부와 외부SD카드 공간을 분리하였기 때문입니다.
요즘은 아이폰처럼 일체형에 확장이 않되는 폰도 많지만 말이지요.

 

2. Internal Storage vs External Storage

그럼 내부와 외부는 프로그래밍 적으로 어떻게 다를까요?

 

2-1. 내부저장공간 (Internal Storage)

우선, 내부저장공간에 대해 알아보겠습니다.

이것은 앱에게 주어진 공간이기 때문에,
스마트폰에 앱이 설치되있다면, 언제든 사용할 수 있는 공간입니다.

 

그렇지만, 앱에게 주어진 공간이므로,
앱이 삭제되면 데이터도 같이 사라지고,
액세스도 다른앱에서는 할 수 없게 됩니다.

 

2-2. 외부저장공간 (External Storage)

 

이번엔 외부저장공간을 보겠습니다.
내부외부가 분리되있는 폰의 경우,
유저가 외부SD카드를 빼버리거나 넣지 않을경우,존재하지 않게 됩니다.
프로그래머입장에서는 존재유무를 확인해야할 수도 있습니다.
이곳에 넣은 파일은 어디에서도 접근이 가능합니다.
유저가 컴퓨터를 열어서 볼 수 있게하거나,
다른 앱에서도 접근할 수 있게 하려면 이곳에 저장해야합니다.

 

3. Internal Storage에 저장하기

내부저장공간에는 두가지 디렉토리가 있습니다.
하나는 파일을 저장하는 공간이고,
다른 하나는 캐쉬파일을 저장하는 공간입니다.


캐쉬파일을 사용할 때는, 다 사용하면 지워주어야 하고,
그렇지 않더라도 주기적으로 지워줘야 합니다.
그렇지 않으면 앱이 계속 커질 수 있을테니까요.

일반 파일을 저장하는 공간에는 getFileDir()로 접근하고,
캐쉬파일을 저장하는 공간에는 getCacheDir()로 접근합니다.

따라서 파일을 생성할려고 하면
FileOutputStream을 이용하거나,
위의 getFilesDir()메소드로, 파일 저장위치를 받아와서, File클래스를 사용할 수 있습니다.

File file = new File(getFilesDir(), "testFileName");

 

 

3-1. Internal Storage에 일반파일 저장

여기서 일반파일은 임시적인 캐쉬파일이 아닌 모든파일을 애기합니다.

먼저 파일이름과 파일에 저장할 이름을 텍스트를 설정해주세요.

파일이름은 Testing + 현재시간 으로 하겠습니다.

(혹시 SimpleDataFormat에 대해서 보고싶으신 분들은 아래링크를 눌러주세요~)

>>> 날짜 표현할 때 SimpleDateFormat <<<< 

 

 

 

이제 필요한 것은 파일로 바이트스트림을 저장해주는,

FileOutputStream을 얻어오는 것인데요. 이것은 안드로이드 앱내의 프라이빗 파일을 열어서 스트림을 열어주고, 파일이 없으면 생성해서 스트림을 열어주는

openFileOutput()이라고 하는 메소드로 가져올 수 있습니다.

 

openFileOutput()의 인자에 저장할 파일이름과, 저장모드를 넣어줘야 하는데요.

 

MODE_PRIVATE 이라고 하면 명시적으로 이 앱은 내앱에서만 접근가능하다고 해주는 것입니다.

WORLD는 다른앱에서 앱의 패키지네임과 파일명을 알면 접근할수 있도록 해주는 것인데요.

보안상 위험하므로, 사용하지 말것을 권장하고 있고 deprecated되었습니다.

 

 

openFileOutput()으로 OutputStream을 얻어온다음에는 

write()메소드로 적어주고, close로 닫아주면 됩니다.

 

참고로, OutputStream은 바이트단위로 버퍼에 저장했다가, 출력해주는 Stream인데요.

저희가 만든 myText를 ByteArray로 리턴해주는 getBytes() 메소드를 이용해서 바이트로 바꾸어서 write()메소드에 인자로 줘야 합니다.

 

(input, outputSream에 대한 자세한 사항은 아래 링크를 눌러주세요.)

>>> Java IO에서 InputStream, OutputStream, Reader, Writer <<<

 

최종적으로는 다음과 같습니다.

 

 

 

3-2. Internal Storage에 캐쉬파일 저장

임시적인 이미지 같은 것을 저장할때 주로 사용하는데요.

이럴 때는 openFileOutput()메소드가 아니라, createTempFile()메소드를 사용합니다.

 

카메라로 이미지를 찍었다고 가정해보겠습니다.

그 이미지를 서버로 전송하기전에 임시로 캐쉬폴더에 저장한다고 한다고 가정해보겠습니다.

 

카메라로 사진을 찍고 Intent로 받은 Uri를 파싱해서, 파일이름을 받아내서

그 파일이름으로 캐쉬디렉토리에 생성해주면 됩니다.

 

이 때 캐쉬디렉토리에 파일을 생성해주는 메소드가

바로, createTempFile()  메소드인데요.

세번째 인자로 들어온 디렉토리 위치에,

첫번째 인자인 fileName으로 파일을 생성해주는데,

두번째 인자가 파일 .jpg같은 suffix인데요. 없으면 tmp를 자동으로 붙여줍니다.

 

아래의 경우 안드로이드 앱 내부의 cache디렉토리에 Uri에서 받은 파일이름을 이용해서, 임시파일을 생성해주는 코드입니다.

 

 

이렇게 해서 안드로이드 앱내부에 파일을 저장하는 방법들을 살펴보았구요.

외부에 파일을 저장하는 방법은 다음 글에서 정리해보겠습니다~.

728x90

댓글