반응형

내부 저장장치에 파일 저장하기(Save a File on Internal Storage)

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

 내부 저장소(Internal Storage)에 파일을 저장 할 때, 여러분은 아래의 두개 메소드중 하나를 호출함으로서 파일을 저장할 알맞은 디렉토리를 가지고 있는 File 인스턴스를 얻을 수 있습니다.


getFileDir()

   여러분의 앱이 저장된 내부 저장소의 디렉토리(internal directory)를 나타내고 있는 File 인스턴스(instance)를 리턴합니다.


getCacheDir()

   앱의 임시 캐시(cache) 파일을 저장하고 있는 내부 저장소의 디렉토리를 나타내고 있는 File 인스턴스를 리턴합니다. 파일이 더 이상 필요하지 않으면 각 파일을 삭제해야 하며 1MB와 같이, 주어진 시간에 사용되는 메모리의 총양에 대한 합리적인 크기 제한을 구현합니다. 만약 시스템이 저장공간이 부족해 지기 시작하면, 어떠한 경고도 없이 여러분의 캐시(cache) 파일을 제거 할 수도 있습니다.


 이들 디렉토리중 하나에 새로운 파일을 생성하기 위해서는, File() 생성자함수를 호출하면서 파라미터로 여러분의 내부 저장 디렉토리를 지정하는 위의 메소드중 하나를 사용해서 File 객체를 전달합니다. 예:

 File file = new File(context.getFilesDir(), filename);


 위를 대체해서, 여러분은 앱의 내부 저장 디렉토리의 파일에 쓰기(저장)을 하도록 하는 FileOutputStream객체를 openFileOutput()을 호출하여 사용할 수도 있습니다. 아래는 파일에 몇가지 텍스트를 쓰는 방법의 예제입니다.

 String filename = "myfile";

 String string = "Hello world!";

 FileOutputStream outputStream;


 try {

   outputStream = openFileOutput(filename, Context.MODE_PRIVATE);

   outputStream.write(string.getBytes());

   outputStream.close();

 } catch (Exception e) {

   e.printStackTrace();

 }


또한, 만약 일부의 파일들을 캐시메모리에 저장할 필요가 있다면, 여러분은 createTempFile()로 대신하여 사용해야 합니다. 예를 들어, 아래의 매소드는 URL 로 부터 파일 이름을 추출하여.앱의 내부 캐시 디렉토리안에 추출된 이름으로 파일을 만듭니다. 

 public File getTempFile(Context context, String url) {

    File file;

    try {

        String fileName = Uri.parse(url).getLastPathSegment();

        file = File.createTempFile(fileName, null, context.getCacheDir());

    catch (IOException e) {

        // Error while creating file

    }

    return file;

}


Note : 앱이 저장되는 내부 저장 디렉토리는 안드로이드 파일 시스템의 특정 지역안에 앱의 패키지 이름으로 지정됩니다. 기술적으로, 다른 앱은 여러분이 읽을 수 있도록 설정하기만 했다면 여러분 앱의 내부 저장 파일을 읽을 수 있습니다. 어쨋든, 다른 앱 역시 여러분 앱의 패키지 이름과 파일 이름을 알아야만 합니다. 다른 앱들은 여러분이 명시적으로 여러분의 파일을 읽고 쓸 수 있도록 설정하지 않은 상태에서 여러분의 내부 디렉토리를 탐색하거나 읽고 쓸수 없습니다. 그래서 여러분이 내부 저장소에 있는 여러분의 파일에 대해MODE_PRIVATE로 하기만하면, 다른 앱들은 절대로 여러분의 파일에 접속할 수 없습니다.




외부 저장장치에 파일 저장하기(Save a File on External Storage)

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

 사용자가 PC에 있는 저장장치를 사용하거나 외부 저장장치(External Storage)로 제공된 SD card 를 제거햇을 때와 같이 외부 저장장치를 사용할 수 없을 지도 모르게 때문에 여러분은 장치에 접속하지 전에 저장장치가 사용할 수 있는지 항상 점검해야만 합니다. 여러분은 getExternalStorageState() 메소드를 호출함으로서 외부 저장장치(External Storage)의 상태를 요청할 수 있습니다. 만약 이 메소드로부터 리턴된 상태가 MEDIA_MOUNTED 라면, 여러분은 파일을 이 장치에 읽고 쓸 수 있습니다. 예를 들어, 아래의 메소드들은 저장장치의 사용가능여부를 알아내는데 매우 유용합니다.

 /* Checks if external storage is available for read and write */

public boolean isExternalStorageWritable() {

    String state = Environment.getExternalStorageState();

    if (Environment.MEDIA_MOUNTED.equals(state)) {

        return true;

    }

    return false;

}


/* Checks if external storage is available to at least read */

public boolean isExternalStorageReadable() {

    String state = Environment.getExternalStorageState();

    if (Environment.MEDIA_MOUNTED.equals(state) ||

        Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {

        return true;

    }

    return false;

}



 비록 외부 저장장치가 사용자와 다른앱들에 의해 수정될 수도 있지만, 이곳에 저장 하는 파일들은 두 종류가 있습니다.


Public files

  다른 앱들과 사용자에게 자유롭게 사용할 수 있도록 되어 있는 파일입니다. 사용자가 앱을 언인스톨(uninstall)할 때, 이 파일들은 여전히 사용자가 사용할 수 있는 상태로 남아 있습니다.


 예: 앱에 의한 사진 캡쳐 또는 또다른 다운로드 된 파일들



Private files

  사용자가 앱을 제거할 때 당연하게 앱에 속하며 삭제되어야 할 파일입니다. 비록 기술적으로는 이 파일들이 외부저장장치에 있기 때문에 다른 앱들과 사용자에 의해 접속될 수 있어야 하지만, 실제로는 여러분의 앱 밖으로 값을 제공하지 않는 파일입니다. 사용자가 여러분의 앱을 언인스톨(uninstall)할 때, 시스템은 앱의 외부 프라이빗(Private) 디렉토리안에 있는 모든 파일들을 삭제합니다. 


 예: 앱에 의해 다운로드된 추가적인 리소스들 또는 임시 미디어(Media) 파일들


  

만약 여러분이 외부 저장장치(External Storage)에 파일을 저장하길 원한다면, getExternalStoragePublicDirectory() 메소드를 사용하여 외부 저장장치의 적절한 디렉토리를 나타내는 File 인스턴스(instance)를 얻어야 합니다. 이 메소드는 여러분이 저장하길 원하는 파일의 타입(Type)을 지정하는 인자(argument)를 가집니다( DIRECTORY_MUSIC 또는 DIRECTORY_PICTURE 등). 그래서 다른public 파일들과 디렉토리안에서 논리적으로 조직되어 집니다. 예 :

 public File getAlbumStorageDir(String albumName) {

    // Get the directory for the user's public pictures directory. 

    File file = new File(Environment.getExternalStoragePublicDirectory(

            Environment.DIRECTORY_PICTURES), albumName);

    if (!file.mkdirs()) {

        Log.e(LOG_TAG, "Directory not created");

    }

    return file;

}


만약 미리 지정된 하위 디렉토리(sub directory)중에 여러분의 파일에 알맞은 이름이 없다면, 위의 메소드를 대신해서 여러분은getExternalFilesDir()의 호출로 대신하고 null 을 전달합니다. 이렇게 하면 외부 저장소에서 여러분 앱의 프라이빗(Private) 디렉토리에 대한 루트(root) 디렉토리을 리턴합니다.


 getExternalFilesDir()로 받아온 디렉토리안에 만든 디렉토리는 사용자가 앱을 언인스톨할 때 자동으로 지워진다는 것을 기억하시기 바랍니다. 만약 여러분이 저장한 파일이 사용자가 앱을 언인스톨한 후에도 여전히 남아있기를 원한다면( 여러분의 앱이 카메라이고 사용자가 사진을 유지하고 싶어할때와 같은 경우) 여러분은 반드시 getExternalStoragePublicDirectory()를 사용하셔야 합니다.


 여러분이 getExternalStoragePublicDirectory()을 사용하여 공유된 파일이든 또는 getExternalFilesDir()를 사용하여 프라이빗하고 사용하는 앱의 파일이든 상관없이, 디렉토리의 이름은 DIRECTORY_PICTURE 처럼 API 상수에 의해 제공되어진 것이라는 것이 중요합니다. 이 디렉토리의 이름들은 파일이 시스템에 의해 제대로 처리된다는 것을 보장합니다. DIRECTORY_RINGTONES 안에 저장된 음악 파일들은 시스템미디어 스캐너에 의해 음악대신 벨소리로 분류되어 집니다.



자유 공간 요청하기(Query Free Space)

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

만약 여러분이 저장하는 데이터의 양이 얼마인지 미리 알고 있다면, 여러분은 getFreeSpace() 또는 getTotalSpace()를 호출하여IOException없이 충분한 공간을 사용할 수 있는지 확인할 수 있습니다. 이 메소드들은 각 각 저장장치의 현재 사용가능 공간과 전체 공간을 알려줍니다. 이 정보는 일정 임계치 값 이상의 저장공간이 꽉 차는 것을 회피하는데 유용합니다.


Note : 여러분에게 여러분의 파일을 저장하기 전에 사용할 수 있는 공간의 총양에 대한 체크할 필요가 없습니다. 만약 여러분이 사용해야 하는 공간이 정확히 얼마인지 알지 못할 때는 이렇게 하는 것이 필요할 수 도 있습니다. 예를들어, 만약 PNG 이미지를 JPEG으로 변경함으로서 여러분이 이전에 저장한 파일의 인코딩(encoding)이 변경되어 진다면, 여러분은 사전에 파일의 사이즈를 알지 못합니다.




파일 삭제하기(Delete a File)

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

여러분은 파일이 더이상 필요하지 않으면 항상 삭제해야만 합니다. 파일을 지우는 가장 정확한 방법은 파일을 열었던 참조변수에게delete()를 호출하도록 하는 것입니다.


 myFile.delete();


만약 파일을 내부 저장장치에 저장했다면, 여러분은 Context 에게 위치를 요청할 수 있으며 deleteFile()을 호출함으로서 파일을 삭제할 수 있습니다.


 myContext.deleteFile(fileName);




Note : 사용자가 앱을 언인스톨 할때, 안드로이드 시스템은 아래의 항목을 삭제합니다.

° 내부 저장장치에 있는 앱의 모든 파일들

° getExternalFilesDir() 를 사용해서 외부 저장장치에 저장한 앱의 모든 파일들


어쨋든 여러분은 getCacheDir()로 만든 모든 캐시된 파일들은 수동으로 직접 삭제 해야만 하며, 정기적으로 더 이상 필요하지 않은 다른 파일들을 삭제해야 합니다. 

반응형

+ Recent posts