Cách an toàn để tạo tệp Temp trong Java là gì?


96

Tôi đang tìm một cách an toàn để tạo tệp tạm thời trong Java. An toàn, ý tôi là như sau:

  • Tên phải là duy nhất, ngay cả trong các điều kiện chủng tộc tiềm năng (ví dụ: một Chủ đề khác gọi cùng một func cùng một lúc hoặc một quy trình khác chạy mã này đồng thời)
  • Tệp phải ở chế độ riêng tư, ngay cả trong các điều kiện chủng tộc tiềm năng (ví dụ: một người dùng khác cố gắng chmod tệp ở tốc độ cao)
  • Tôi có thể yêu cầu nó xóa tệp mà tôi không cần phải xóa chung chung và có nguy cơ xóa nhầm tệp
  • Tốt nhất, nên đảm bảo rằng tệp đã bị xóa, ngay cả khi ngoại lệ được ném ra trước khi tôi có cơ hội
  • Tệp phải được đặt mặc định thành một vị trí lành mạnh (ví dụ: dir tmp được chỉ định JVM, mặc định là dir tạm thời của hệ thống)

3
Sử dụng File f = File.createTempFile(prefix, extension). Nó sẽ được đặt trong dir tạm thời. Và cùng với f.deleteOnExit()nó sẽ tự động bị xóa khi thoát.
BackSlash

3
Xóa trên Exit sẽ không xóa tệp, nếu vm thoát với một ngoại lệ.
Johannes

Câu trả lời:


130

Sử dụng File.createTempFile().

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

Sẽ tạo một tệp trong dir tạm thời, như:

tiền tố-6340763779352094442-hậu tố


1
Chỉ cần FYI, bạn không cần phải lo lắng về việc có một tiền tố / hậu tố duy nhất, vì Java sẽ tạo một chuỗi số ngẫu nhiên ở giữa.
Squeazer

4
Siêu! Có vấn đề gì khi thực hiện bình thường tempFile.delete()ngoài việc deleteOnExit(vì tôi không muốn có một đống tệp tạm thời bị treo xung quanh trước khi thoát) không?
SRobertJames

3
Không, bạn có thể làm theo một trong hai cách.
Stefan

1
@SRobertJames: Không vấn đề gì. Vấn đề là việc tạo ra các tệp tạm thời với các tên có thể đoán trước được sẽ gây ra các vấn đề về bảo mật. Sau khi chúng được tạo một cách an toàn với các quyền thích hợp, chúng sẽ không.
Markus W Mahlberg

1
Tôi sẽ không coi điều này là an toàn, tệp được tạo ra có thể đọc được trên toàn thế giới và nó nằm trong thư mục tmp mà bất kỳ người dùng nào cũng có thể truy cập được.
Peter Gerber


0
String tempfilePath = System.getProperty("java.io.tmpdir");
tempfilePath = tempfilePath.concat("filename.extension");

không yêu cầu tiền tố.

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.