วิธีที่ปลอดภัยในการสร้างไฟล์ชั่วคราวใน Java คืออะไร?


101

ฉันกำลังมองหาวิธีที่ปลอดภัยในการสร้างไฟล์ชั่วคราวใน Java โดยปลอดภัยฉันหมายถึงสิ่งต่อไปนี้:

  • ชื่อควรไม่ซ้ำกันแม้ภายใต้สภาวะการแข่งขันที่อาจเกิดขึ้น (เช่นเธรดอื่นเรียก func เดียวกันในเวลาเดียวกันหรือกระบวนการอื่นเรียกใช้รหัสนี้พร้อมกัน)
  • ไฟล์ควรเป็นไฟล์ส่วนตัวแม้ว่าจะอยู่ภายใต้สภาวะการแข่งขันที่อาจเกิดขึ้น (เช่นผู้ใช้รายอื่นพยายามที่จะ chmod ไฟล์ด้วยอัตราที่สูง)
  • ฉันสามารถบอกให้ลบไฟล์โดยที่ฉันไม่ต้องทำการลบทั่วไปและเสี่ยงต่อการลบไฟล์ที่ไม่ถูกต้อง
  • ตามหลักการแล้วควรตรวจสอบให้แน่ใจว่าไฟล์ถูกลบแม้ว่าจะมีข้อยกเว้นเกิดขึ้นก่อนที่ฉันจะได้รับโอกาสก็ตาม
  • ไฟล์ควรตั้งค่าเริ่มต้นเป็นตำแหน่งที่มีเหตุผล (เช่น JVM ที่ระบุ tmp dir โดยตั้งค่าเริ่มต้นเป็น dir temp ของระบบ)

3
ใช้File f = File.createTempFile(prefix, extension). มันจะถูกวางไว้ใน temp dir และด้วยf.deleteOnExit()มันจะถูกลบโดยอัตโนมัติเมื่อออก
BackSlash

3
Delete on Exit จะไม่ลบไฟล์หาก vm ออกโดยมีข้อยกเว้น
Johannes

คำตอบ:


135

ใช้File.createTempFile().

File tempFile = File.createTempFile("prefix-", "-suffix");
//File tempFile = File.createTempFile("MyAppName-", ".tmp");
tempFile.deleteOnExit();

จะสร้างไฟล์ใน temp dir เช่น:

คำนำหน้า -6340763779352094442- ต่อท้าย


1
เพียงแค่ FYI คุณไม่จำเป็นต้องกังวลเกี่ยวกับการมีคำนำหน้า / คำต่อท้ายที่ไม่ซ้ำกันเนื่องจาก Java จะสร้างสตริงตัวเลขแบบสุ่มระหว่างกัน
Squeazer

4
สุดยอด! มีปัญหาใด ๆ ในการทำตามปกติtempFile.delete()นอกเหนือจากdeleteOnExit(เนื่องจากฉันไม่ต้องการมีไฟล์ชั่วคราวจำนวนมากค้างอยู่ก่อนออก)
SRobertJames

3
ไม่คุณสามารถทำได้ทั้งสองวิธี
Stefan

1
@SRobertJames: ไม่มีปัญหา สิ่งนี้คือการสร้าง tempfiles ที่มีชื่อที่คาดเดาได้ทำให้เกิดปัญหาด้านความปลอดภัย เมื่อสร้างขึ้นด้วยวิธีที่ปลอดภัยด้วยการอนุญาตที่เหมาะสมแล้วจะไม่
Markus W Mahlberg

1
ฉันไม่คิดว่าสิ่งนี้ปลอดภัยไฟล์ที่สร้างขึ้นนั้นสามารถอ่านได้ทั่วโลกและอยู่ในไดเร็กทอรี tmp ซึ่งมีแนวโน้มที่จะเข้าถึงได้โดยผู้ใช้ทุกคน
Peter Gerber

38

เนื่องจาก Java 7 มีไฟล์ API ใหม่ "NIO2" ซึ่งมีวิธีการใหม่ในการสร้างไฟล์และไดเร็กทอรี temnp ดู

เช่น

Path tempDir = Files.createTempDirectory("tempfiles");

หรือ

Path tempFile = Files.createTempFile("tempfiles", ".tmp");

1
ฉันชอบ NIO ซึ่งไม่ต้องใช้คำนำหน้า
Franklin Yu

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