Android에서 임시 파일 작성


204

Android에서 임시 파일을 만드는 가장 좋은 방법은 무엇입니까?

File.createTempFile 을 사용할 수 있습니까 ? 문서가 매우 모호합니다.

특히, 작성된 임시 파일이 언제 File.createTempFile삭제되는지는 확실하지 않습니다 .


임시 파일이 논의되는 스택 오버 플로우 에서이 스레드 로 시작할 수 있습니다.
Benny Skogberg

이 Android 개발자 Google 그룹 토론에 관심이있을 수 있습니다. groups.google.com/group/android-developers/browse_thread/thread/…
hpique

답변:


286

이것이 내가 일반적으로하는 일입니다.

File outputDir = context.getCacheDir(); // context being the Activity pointer
File outputFile = File.createTempFile("prefix", "extension", outputDir);

그들의 삭제에 관해서는 확실하지 않습니다. 캐시 구현에서 이것을 사용하기 때문에 캐시 디렉토리 크기가 사전 설정 값이 될 때까지 가장 오래된 파일을 수동으로 삭제합니다.


2
그게 내가하는 일입니다. 필자는 캐시 디렉토리를 사용하지 않으면 createTempFile이 실제 임시 파일을 생성하지 않지만 실제로는 문서화되지 않았다고 가정합니다.
hpique

다른 앱도 실행하여 자체 임시 파일을 생성하더라도 앱이 실행되는 동안 파일이 유지된다고 가정 할 수 있습니까?
안드로이드 개발자

1
모든 응용 프로그램은 자체 캐시를 사용합니다. 기본적으로 내부 저장소에 저장된 파일은 응용 프로그램 전용이며 다른 응용 프로그램은 해당 파일에 액세스 할 수 없으며 사용자도 액세스 할 수 없습니다. 일부 데이터를 캐시하려면 getCacheDir ()을 사용하여 애플리케이션이 임시 캐시 파일을 저장해야하는 파일을 열어야합니다. 기기의 내부 저장 공간이 부족하면 Android에서 이러한 캐시 파일을 삭제하여 공간을 복구 할 수 있습니다. 그러나 이러한 파일을 정리하기 위해 시스템에 의존해서는 안됩니다. 출처
felixd

공유 의도를 사용하여이 파일을 공유 할 수 있습니까?
aks

4
outputFile.deleteOnExit ()를 호출 할 수 있습니다. 이론적으로 시스템은 앱이 종료되면 시스템을 정리합니다. File 클래스의 표준 메소드
Dave Hubbard

90

내부외부 임시 파일 에 대한 모범 사례 :

내부 캐시

일부 데이터를 영구적으로 저장하지 않고 getCacheDir()캐시하려면 애플리케이션이 임시 캐시 파일을 저장해야하는 내부 디렉토리를 나타내는 파일을 열어야합니다.

기기의 내부 저장 공간이 부족하면 Android에서 이러한 캐시 파일을 삭제하여 공간을 복구 할 수 있습니다. 그러나 이러한 파일을 정리하기 위해 시스템에 의존해서는 안됩니다. 항상 캐시 파일을 직접 유지 관리하고 1MB와 같이 적당한 공간에서 사용하십시오. 사용자가 응용 프로그램을 제거하면 이러한 파일이 제거됩니다.

외부 캐시

캐시 파일을 저장해야하는 외부 저장소 디렉토리를 나타내는 파일을 열려면을 호출하십시오 getExternalCacheDir(). 사용자가 응용 프로그램을 제거하면 이러한 파일이 자동으로 삭제됩니다.

유사하게 ContextCompat.getExternalFilesDirs(), 위에서 언급 한, 당신은 또한 호출하여 (사용 가능한 경우) 보조 외부 저장 장치에 캐시 디렉토리에 액세스 할 수 있습니다 ContextCompat.getExternalCacheDirs().

팁 : 파일 공간을 유지하고 앱 성능을 유지하려면 캐시 파일을 신중하게 관리하고 앱 수명주기 동안 더 이상 필요하지 않은 파일을 제거하는 것이 중요합니다.


2
이것은 큰 임시 파일로 수행 할 작업에 대한 질문에 적절하게 답변하지 않습니다. 가장 좋은 방법은 무엇입니까? 단순히 일반 파일을 관리하는 것 외에는 하나도 없다고 생각합니다.
Merk

35

임시 내부 파일의 경우 두 가지 옵션이 있습니다

1.

File file; 
file = File.createTempFile(filename, null, this.getCacheDir());

2.

File file
file = new File(this.getCacheDir(), filename);

두 옵션 모두 응용 프로그램 캐시 디렉토리에 파일을 추가하므로 필요에 따라 공간을 확보하기 위해 지울 수 있지만 옵션 1은 파일 이름 끝에 임의의 숫자를 추가하여 파일을 고유하게 유지합니다. 또한 .tmp기본적으로 파일 확장자를 추가 하지만 2 번째 매개 변수를 사용하여 무엇이든 설정할 수 있습니다. 수 (접미사 / 파일 확장자와 함께 추가 될 파일 이름을 지정에도 불구하고 난수 수단의 사용은 동일하게 유지하지 않습니다 .tmp기본적으로) 당신은 당신의 파일 이름을 지정 예 internal_file와 같이 나온다 internal_file1456345.tmp. 내선 번호를 지정할 수있는 반면 추가되는 번호는 지정할 수 없습니다. 그러나 생성 한 파일 이름을 찾을 수 있습니다file.getName();하지만 파일을 삭제하거나 읽을 때마다 사용할 수 있도록 어딘가에 저장해야합니다. 따라서 지정한 파일 이름이 만들어진 파일 이름이므로 두 번째 옵션을 선호합니다.


2
앱의 프로세스가 활성화되지 않은 경우에만 임시 파일이 삭제된다고 가정 할 수 있습니까?
안드로이드 개발자

2
@androiddeveloper No.
Guilherme Bernal

@GuilhermeBernal 어떻게 알죠? 삭제되는 것을 보셨습니까?
Android 개발자

1
@androiddeveloper 세부 정보를 미리 알려주지 않아 죄송합니다. 사용자는 앱을 열고 설정으로 이동하여 캐시를 지운 다음 앱을 종료하지 않고 앱으로 돌아갈 수 있습니다. 따라서 앱은 캐시 파일이 삭제되지 않는다고 가정 할 수 없으며 사용자 상호 작용없이 안드로이드 자체가 멈추지 않습니다.
Guilherme Bernal

14

context.getCacheDir ()을 사용하여 캐시 디렉토리를 사용할 수 있습니다 .

File temp=File.createTempFile("prefix","suffix",context.getCacheDir());

10
파일 temp = File.createTempFile ( "접두사", "접미사", context.getCacheDir ());
Patrick

고마워요,하지만 내 파일 크기는 0B와 같습니다. 문제가있는 아이디어는 무엇입니까?
user7856586

0

당신은 File.deleteOnExit()방법을 사용할 수 있습니다

https://developer.android.com/reference/java/io/File.html#deleteOnExit ()

여기에서 참조됩니다 https://developer.android.com/reference/java/io/File.html#createTempFile(java.lang.String , java.lang.String, java.io.File)


7
사용되는 JVM의 이상한 맛으로 인해 안드로이드에서는 거의 쓸모가 없습니다 (거의 정상적으로 끝나지는 않습니다)
weaknespase

1
더 이상 필요하지 않은 경우 성능 문제가없는 한 즉시 데이터를 삭제, 해제 또는 삭제하십시오.
Redwolf

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.