반응형

 안드로이드는 다른 플랫폼의 디스크 기반 파일시스템과 유사한 파일시스템을 사용합니다. 이번시간에는 File 클래스의 API를 사용하여 파일을 읽고 쓰기위한 안드로이드의 파일 시스템 작업방법을 소개하겠습니다.


 File 객체는 건너띄는 것 없이 처음부터 끝까지 순서대로 많은 양의 데이터를 읽고 쓰는데 적합합니다. 예를 들어, 이미지 파일이나 네트워크를 통해 변경되어지는 것들을 저장하는데 좋습니다.


 이번 시간에는 여러분의 앱에 기본 파일 관련 작업을 수행하기 위한 방법을 보여드리겠습니다. 이 포스트는 여러분이 기본적인 리눅스의 파일시스템과 java.io 패키지의 표준 파일 입/출력 API 알고 있는 것으로 가정하고 설명할 것입니다.


 

내부 또는 외부 저장장치 선택 (Choose Internal or External Storage)

------------------------------------------------------

 모든 안드로이드 단말기들은 두개의 파일 저장 영역을 가지고 있습니다. : "Internal" 과  "External" 저장장치

이 저장소의 이름들은 안드로이드 이전부터 만들어져 있던 것들입니다. 대부분의 단말기들은 내장되어 있는 비휘발성 메모리(내부 메모리Internal Storage)가 제공되어 있으며, 추가적으로 SD card(External Storage)와 같은 제거할 수있는(removable) 저장장치를 가지고 있습니다. 일부 단말기들은 "internal"과 "external" 파티션(partition)으로 영구 저장장치의 공간을 나누기도 합니다. 그래서 제거할수 있는 외부 저장소가 없더라도, 항상 두개의 공간을 가지게 됩니다. 그리고 API의 동작은 외부 저장소가 제거될 수 있든 아니든 상관없이 똑같이 동작합니다. 아래의 목록은 각각의 저장공간에 대한 특징을 요약한 것입니다.



내부 저장장치(Internal Storage)

° 이 장치는 항상 사용할 수 있습니다.

° 이곳에 저장된 파일을 기본적으로는 오직 여러분의 앱에 의해서만 접속할 수 있습니다.

°사용자가 여러분의 앱을 언인스톨(uninstall) 할 때, 시스템은 내부저장소로부터 앱의 파일들을 모두 제거합니다.


 내부 저장소는 사용자든 다른 앱들이든 여러분의 파일에 접속할 수 없도록 하고 싶을 때 사용하기 좋은 곳입니다.



외부 저장장치(External Storage)

° 이장치는 항상 사용할 수 는 없습니다. 왜냐하면 사용자가 USB 저장장치처럼 외부저장소를 마운트(mount)할 수도 잇고 어떤 경우에는 단말기에서 제거할 수도 있기 때문입니다.

° 이 장치는 기본적으로 world-readable 입니다. 그래서 이곳에 저장된 파일은 여러분의 제어 밖에서(동의없이) 읽어질 수도 있습니다.

° 사용자가 여러분의 앱을 언인스톨(uninstall)할 때, 시스템은 여러분이 getExternalFilesDir()로 만든 디렉토리에 파일을 저장했을 때만 자동으로 제거됩니다.


 외부 저장소는 파일의 접속 제한이 필요하지 않으며 다른 앱들이나 사용자가 컴퓨터를 사용하여 접속하도록 공유하고 싶을 때 사용하기 좋은 곳입니다.


Tip : 기본적으로 앱들은 내부 저장소(Internal Storage)에 인스톨(install)되지만, 메니페스트 안에 android:installLocation 속성을 통해 저장위치를 지정할 수 있습니다. 그래서 여러분의 앱이 외부 저장장치(External Storage)에 인스톨(install)되도록 할 수 있습니다. 사용자는 내부 저장소(Internal Storage) 보다 큰 외부 저장소(External Storage)를 가지고 있으며 APK(Android Package)의 용량이 매우 클 때 이 옵션의 진가를 느끼게 됩니다.




외부 저장장치에 대한 퍼미션 취득( Obtain Permissions for External Storage)

-------------------------------------------------------------

 외부 저장장치에 저장하기 위해서는 반드시 메니페스트 파일안에 WRITE_EXTERNAL_STORAGE 퍼미션을 요청해야만 합니다.

 <manifest ...>

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

    ...

</manifest>


Caution : 요즘은, 모든 앱들이 특별한 퍼미션없이도 읽을 수 있도록 되어 있습니다. 어쨋든, 이것은 나중에 새로운 버전이 나올 때 변경될 수도 있습니다. 만약 여러분의 앱이 외부 저장소를 읽을 필요가 있다면(저장은 하지 않고), 여러분은 READ_EXTERNAL_STORAGE퍼미션을 선언할 필요가 있을 겁니다. 여러분의 앱이 사용자가 기대한 작업을 지속적으로 하도록 하기 위해서는 나중에 변경되기 전에 이 퍼미션을 지금 선언하는 것이 좋습니다.

 <manifest ...>

    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

    ...

</manifest>

  어쨋든, 만약 여러분의 앱이 WRITE_EXTERNAL_STORAGE 퍼미션을 사용한다면, 그것을 묵시적으로 외부 저장소에서 읽을 수도 있는 퍼미션을 받은 것으로 봅니다.


여러분이 내부 저장소에 파일을 저장할 때는 어떤 퍼미션도 필요하지 않습니다. 여러분의 어플은 항상 내부 저장소의 디렉토리를 읽고 쓸수 있는 퍼미션을 가지고 있습니다.

반응형

+ Recent posts