Tạo tập tin tạm thời trong Android


204

Cách tốt nhất để tạo một tệp tạm thời trong Android là gì?

Có thể File.createTempFile được sử dụng? Các tài liệu rất mơ hồ về nó.

Cụ thể, không rõ khi nào các tệp tạm thời được tạo bằng File.createTempFilesẽ bị xóa, nếu có.


Bạn có thể bắt đầu với luồng này trong stackoverflow, nơi các tệp temp được thảo luận.
Benny Skogberg

Cuộc thảo luận nhóm Google dành cho nhà phát triển Android này có thể được quan tâm: Groups.google.com/group/android-developers/browse_thread/thread/iêu
hpique

Câu trả lời:


286

Đây là những gì tôi thường làm:

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

Về việc xóa chúng, tôi cũng không hoàn toàn chắc chắn. Vì tôi sử dụng điều này trong quá trình thực hiện bộ đệm, tôi xóa thủ công các tệp cũ nhất cho đến khi kích thước thư mục bộ đệm giảm xuống giá trị đặt trước của tôi.


2
Đó là những gì tôi làm là tốt. Giả định của tôi là createdTempFile không tạo các tệp tạm thời thực sự trừ khi nó sử dụng thư mục bộ đệm, nhưng điều này không thực sự được ghi lại.
hpique

Tôi có thể giả sử tệp sẽ duy trì miễn là ứng dụng đang chạy, ngay cả khi các ứng dụng khác cũng chạy và tạo tệp tạm thời của riêng họ không?
nhà phát triển Android

1
Mọi ứng dụng đều sử dụng bộ đệm riêng của nó: Theo mặc định, các tệp được lưu vào bộ nhớ trong là riêng tư đối với ứng dụng của bạn và các ứng dụng khác không thể truy cập chúng (người dùng cũng không thể). Nếu bạn muốn lưu trữ một số dữ liệu, bạn nên sử dụng getCacheDir () để mở một tệp trong đó ứng dụng của bạn sẽ lưu các tệp bộ đệm tạm thời. Khi thiết bị còn ít dung lượng lưu trữ nội bộ, Android có thể xóa các tệp bộ nhớ cache này để khôi phục dung lượng. Tuy nhiên, bạn không nên dựa vào hệ thống để dọn sạch các tệp này cho bạn. Nguồn
felixd

Tôi có thể sử dụng ý định chia sẻ để chia sẻ tập tin này?
aks

4
Bạn có thể gọi outputFile.deleteOnExit (). Về lý thuyết, hệ thống sẽ dọn sạch khi ứng dụng của bạn thoát. Phương thức chuẩn trong lớp File.
Dave Hubbard

90

Thực hành tốt nhất trên các tệp tạm thời bên trongbên ngoài :

Bộ nhớ cache nội bộ

Nếu bạn muốn lưu trữ một số dữ liệu, thay vì lưu trữ liên tục, bạn nên sử dụng getCacheDir()để mở Tệp đại diện cho thư mục nội bộ nơi ứng dụng của bạn sẽ lưu các tệp bộ đệm tạm thời.

Khi thiết bị còn ít dung lượng lưu trữ nội bộ, Android có thể xóa các tệp bộ nhớ cache này để khôi phục dung lượng. Tuy nhiên, bạn không nên dựa vào hệ thống để dọn sạch các tệp này cho bạn. Bạn phải luôn tự duy trì các tệp bộ nhớ cache và ở trong một giới hạn dung lượng hợp lý được sử dụng, chẳng hạn như 1MB. Khi người dùng gỡ cài đặt ứng dụng của bạn, các tệp này sẽ bị xóa.

Bộ nhớ cache ngoài

Để mở một tệp đại diện cho thư mục lưu trữ ngoài, nơi bạn nên lưu các tệp bộ đệm, hãy gọi getExternalCacheDir(). Nếu người dùng gỡ cài đặt ứng dụng của bạn, các tệp này sẽ tự động bị xóa.

Tương tự như ContextCompat.getExternalFilesDirs(), được đề cập ở trên, bạn cũng có thể truy cập vào thư mục bộ đệm trên bộ nhớ ngoài thứ cấp (nếu có) bằng cách gọi ContextCompat.getExternalCacheDirs().

Mẹo: Để duy trì không gian tệp và duy trì hiệu suất của ứng dụng, điều quan trọng là bạn phải quản lý cẩn thận các tệp bộ nhớ cache của mình và xóa những tệp không cần thiết nữa trong suốt vòng đời của ứng dụng.


2
Điều này không trả lời thỏa đáng cho câu hỏi phải làm gì với các tệp lớn tạm thời. Thực hành tốt nhất ở đây là gì? Tôi nghi ngờ không có ai, ngoài việc đơn giản là quản lý một tệp bình thường.
Merk

35

Đối với các tệp nội bộ tạm thời, chúng là 2 tùy chọn

1.

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

2.

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

Cả hai tùy chọn đều thêm các tệp trong thư mục bộ đệm của ứng dụng và do đó có thể bị xóa để tạo khoảng trống theo yêu cầu nhưng tùy chọn 1 sẽ thêm một số ngẫu nhiên vào cuối tên tệp để giữ cho các tệp duy nhất. Nó cũng sẽ thêm một phần mở rộng tập tin .tmptheo mặc định, nhưng nó có thể được đặt thành bất cứ thứ gì thông qua việc sử dụng tham số thứ 2. Việc sử dụng số ngẫu nhiên có nghĩa là mặc dù chỉ định tên tệp, nó không giữ nguyên như số được thêm vào cùng với phần mở rộng hậu tố / tệp ( .tmptheo mặc định), ví dụ: bạn chỉ định tên tệp của mình là internal_filevà xuất hiện dưới dạng internal_file1456345.tmp. Trong khi đó, bạn có thể chỉ định tiện ích mở rộng mà bạn không thể chỉ định số được thêm vào. Tuy nhiên, bạn có thể tìm thấy tên tệp mà nó tạo ra thông quafile.getName();, nhưng bạn sẽ cần lưu trữ nó ở đâu đó để bạn có thể sử dụng nó bất cứ khi nào bạn muốn ví dụ để xóa hoặc đọc tệp. Do đó, vì lý do này, tôi thích tùy chọn thứ 2 vì tên tệp bạn chỉ định là tên tệp được tạo.


2
Tôi có thể cho rằng các tệp tạm thời sẽ chỉ bị xóa khi quá trình của ứng dụng không còn tồn tại không?
nhà phát triển Android

2
@androiddeveloper Số
Guilherme Bernal

@GuilhermeBernal Làm sao bạn biết điều đó? Bạn đã thấy nó bị xóa?
nhà phát triển Android

1
@androiddeveloper Xin lỗi vì đã không cung cấp chi tiết sớm hơn. Một người dùng có thể mở ứng dụng, sau đó vào cài đặt, xóa bộ nhớ cache và sau đó quay lại ứng dụng mà không cần phải giết nó. Vì vậy, một ứng dụng không thể cho rằng tệp bộ nhớ cache sẽ không bị xóa và không có gì ngăn Android tự làm như vậy mà không có sự tương tác của người dùng.
Guilherme Bernal

14

Bạn có thể sử dụng thư mục bộ đệm bằng bối cảnh.getCacheDir () .

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

10
Tệp temp = File.createTempFile ("tiền tố", "hậu tố", bối cảnh.getCacheDir ());
Patrick

Cảm ơn, tôi đã làm nó, nhưng kích thước tệp của tôi bằng 0B, vấn đề là ở đâu, có ý tưởng nào không?
dùng7856586

0

Bạn có thể sử dụng File.deleteOnExit()phương pháp

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

Nó được tham chiếu tại đây https://developer.android.com/reference/java/io/File.html#createTempFile(java.lang.String , java.lang.String, java.io.File)


7
Nó khá là vô dụng trên Android do hương vị lạ của JVM được sử dụng (Nó gần như không bao giờ chấm dứt bình thường)
yếu tố

1
Miễn là không có mối quan tâm về hiệu suất, xóa, miễn phí hoặc xóa dữ liệu ngay lập tức, khi bạn không cần nó nữa.
Redwolf

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.