สร้างไฟล์ชั่วคราวใน Android


204

วิธีที่ดีที่สุดในการสร้างไฟล์ชั่วคราวใน Android คืออะไร

สามารถใช้File.createTempFileได้หรือไม่ เอกสารมีความคลุมเครือเกี่ยวกับเรื่องนี้

โดยเฉพาะอย่างยิ่งจะไม่ชัดเจนเมื่อลบไฟล์ชั่วคราวที่สร้างขึ้นด้วยFile.createTempFileถ้าเคย


คุณสามารถเริ่มต้นด้วยเธรดนี้ใน stackoverflow ซึ่งมีการกล่าวถึง temp-files
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 ไม่ได้สร้างไฟล์ชั่วคราวจริงเว้นแต่ว่ามันจะใช้แคช dir แต่นี่ไม่ใช่เอกสารจริง
hpique

ฉันจะถือว่าไฟล์นั้นยังคงอยู่ได้ตราบใดที่แอพยังทำงานอยู่แม้ว่าแอพอื่นจะทำงานและสร้างไฟล์ชั่วคราวของตัวเองหรือไม่?
นักพัฒนา Android

1
ทุกแอปใช้เป็นแคชของตัวเอง: โดยค่าเริ่มต้นไฟล์ที่บันทึกไว้ในที่จัดเก็บข้อมูลภายในจะเป็นส่วนตัวของแอปพลิเคชันของคุณและแอปพลิเคชันอื่น ๆ ไม่สามารถเข้าถึงได้ หากคุณต้องการแคชข้อมูลบางส่วนคุณควรใช้ getCacheDir () เพื่อเปิดไฟล์ที่แอปพลิเคชันของคุณควรบันทึกไฟล์แคชชั่วคราว เมื่ออุปกรณ์มีพื้นที่เก็บข้อมูลภายในต่ำ Android อาจลบไฟล์แคชเหล่านี้เพื่อกู้คืนพื้นที่ อย่างไรก็ตามคุณไม่ควรพึ่งพาระบบเพื่อล้างไฟล์เหล่านี้ให้คุณ ที่มา
felixd

ฉันสามารถใช้ความตั้งใจที่จะแชร์ไฟล์นี้ได้หรือไม่?
aks

4
คุณสามารถเรียก outputFile.deleteOnExit () ตามหลักการแล้วระบบจะล้างข้อมูลเมื่อแอพของคุณออก วิธีมาตรฐานในคลาสไฟล์
Dave Hubbard

90

แนวทางปฏิบัติที่ดีที่สุดสำหรับไฟล์ชั่วคราวทั้งภายในและภายนอก :

แคชภายใน

หากคุณต้องการแคชข้อมูลบางส่วนแทนที่จะเก็บไว้อย่างถาวรคุณควรใช้getCacheDir()เพื่อเปิดไฟล์ที่แสดงถึงไดเรกทอรีภายในที่แอปพลิเคชันของคุณควรบันทึกไฟล์แคชชั่วคราว

เมื่ออุปกรณ์มีพื้นที่เก็บข้อมูลภายในต่ำ Android อาจลบไฟล์แคชเหล่านี้เพื่อกู้คืนพื้นที่ อย่างไรก็ตามคุณไม่ควรพึ่งพาระบบเพื่อล้างไฟล์เหล่านี้ให้คุณ คุณควรบำรุงรักษาไฟล์แคชด้วยตัวเองและอยู่ในพื้นที่ จำกัด ที่เหมาะสมเช่น 1MB เมื่อผู้ใช้ถอนการติดตั้งแอปพลิเคชันของคุณไฟล์เหล่านี้จะถูกลบออก

แคชภายนอก

getExternalCacheDir()เปิดแฟ้มที่หมายถึงไดเรกทอรีจัดเก็บข้อมูลภายนอกที่คุณควรบันทึกไฟล์แคชโทร หากผู้ใช้ถอนการติดตั้งแอปพลิเคชันของคุณไฟล์เหล่านี้จะถูกลบโดยอัตโนมัติ

คล้ายกับContextCompat.getExternalFilesDirs()ที่ได้กล่าวมานี้คุณยังสามารถเข้าถึงไดเรกทอรีแคชบนจัดเก็บข้อมูลภายนอกรอง (ถ้ามี) ContextCompat.getExternalCacheDirs()โดยการเรียก

เคล็ดลับ: เพื่อรักษาพื้นที่ไฟล์และรักษาประสิทธิภาพแอปของคุณเป็นสิ่งสำคัญที่คุณจะต้องจัดการแคชไฟล์อย่างระมัดระวังและลบไฟล์ที่ไม่ต้องการอีกต่อไปตลอดอายุการใช้งานของแอป


2
นี่ไม่เพียงพอตอบคำถามว่าจะทำอย่างไรกับไฟล์ชั่วคราวขนาดใหญ่ การปฏิบัติที่ดีที่สุดที่นี่คืออะไร? ฉันสงสัยว่าไม่มีไฟล์เดียวนอกจากจัดการไฟล์ปกติ
Merk

35

สำหรับไฟล์ภายในชั่วคราวมี 2 ตัวเลือก

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
ฉันสามารถสันนิษฐานได้หรือไม่ว่าไฟล์ชั่วคราวจะถูกลบเมื่อกระบวนการของแอพยังไม่ดำเนินการเท่านั้น
นักพัฒนา android

2
@androiddeveloper ไม่
Guilherme Bernal

@ GuilhermeBernal คุณรู้ได้อย่างไร? คุณเคยเห็นมันถูกลบไหม?
นักพัฒนา android

1
@androiddeveloper ขออภัยที่ไม่ได้ให้รายละเอียดก่อนหน้านี้ ผู้ใช้สามารถเปิดแอปจากนั้นไปที่การตั้งค่าล้างแคชแล้วกลับไปที่แอพทั้งหมดโดยไม่ต้องฆ่า ดังนั้นแอปจะไม่สามารถสันนิษฐานได้ว่าไฟล์แคชจะไม่ถูกลบและไม่มีสิ่งใดที่จะทำให้ Android หยุดทำงานโดยไม่ต้องมีการโต้ตอบกับผู้ใช้
Guilherme Bernal

14

คุณสามารถใช้ dir แคชใช้context.getCacheDir ()

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

10
ไฟล์ temp = File.createTempFile ("คำนำหน้า", "คำต่อท้าย", context.getCacheDir ());
Patrick

ขอบคุณฉันทำไปแล้ว แต่ขนาดไฟล์ของฉันเท่ากับ 0B ปัญหาอยู่ที่ไหนความคิดใดบ้าง
7856586

1

คุณสามารถใช้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
มันค่อนข้างไร้ประโยชน์บน Android เนื่องจากรสชาติแปลก ๆ ของ JVM ที่ใช้ (มันแทบจะไม่เคยยุติลงตามปกติ)
weaknespase

1
ตราบใดที่ไม่มีความกังวลเรื่องประสิทธิภาพลบลบหรือปล่อยข้อมูลทันทีเมื่อคุณไม่ต้องการใช้อีกต่อไป
Redwolf

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.