Khi nào thì System.getProperty (“java.io.tmpdir”) trả về “c: \ temp”


110

Chỉ tò mò là khi nào System.getProperty("java.io.tmpdir")trở lại "c:\temp". Theo java.io.File Java Docs -

Thư mục tệp tạm thời mặc định được chỉ định bởi thuộc tính hệ thống java.io.tmpdir. Trên hệ thống UNIX, giá trị mặc định của thuộc tính này thường là "/ tmp" hoặc "/ var / tmp"; trên hệ thống Microsoft Windows, nó thường là "c: \ temp". Một giá trị khác có thể được cấp cho thuộc tính hệ thống này khi máy ảo Java được gọi, nhưng các thay đổi theo chương trình đối với thuộc tính này không được đảm bảo có bất kỳ ảnh hưởng nào đến thư mục tạm thời được sử dụng bởi phương pháp này.

Nhưng trong trường hợp của tôi-

System.out.println(System.getProperty("java.io.tmpdir"));

Luôn trả lại-

C:\Users\admin\AppData\Local\Temp\ i.e. %TEMP%

Nó sẽ trở lại trong điều kiện "c:\temp"nào?

ĐÃ CHỈNH SỬA: Nếu tôi thay đổi% TEMP% thành C: \ Temp thì tôi sẽ nhận được C: \ Temp, phải không? Nhưng tài liệu cho thấy c: \ Temp thay vì C: \ Temp.


4
vi.wikipedia.org/wiki/Temporary_folder Nhìn vào wiki, tôi muốn nói rằng bạn có thể thực hiện nó C:\Tempbằng cách thay đổi% TEMP%, cài đặt Windows 98 hoặc chuyển nó sang java -Djava.io.tmpdir=C:\Temp. Ngoài ra, hãy xem điều này: stackoverflow.com/questions/3437095/…
bezmax,

@Max Cảm ơn MAX. Nếu tôi thay đổi% TEMP% thành C:\Tempthì tôi sẽ nhận được C:\Temp. Đúng? nhưng doc show c:\Tempthay vì C:\Temp. :)
Ashish Pancholi

2
Tôi không biết tại sao ký tự ổ đĩa lại quan trọng với ứng dụng của bạn?
ajduke

@AshishPancholi đã không đưa bạn đến đó?
ajduke

Javadoc 1.4.2 mà bạn đang liên kết đã lỗi thời. 7 Javadoc hiện tại đề cập đến một thư mục "điển hình" của "C:\\WINNT\\TEMP".
Abdull

Câu trả lời:


128

Trong MS Windows, thư mục tạm thời được thiết lập bởi biến môi trường TEMP. Trong XP, thư mục tạm thời được đặt cho mỗi người dùng là Local Settings \ Temp.

Nếu bạn thay đổi biến môi trường TEMP của mình thành C:\temp, thì bạn sẽ nhận được tương tự khi chạy:

System.out.println(System.getProperty("java.io.tmpdir"));


2
Trên Windows có một biến môi trường thứ hai được gọi là% TMP% và nó đôi khi được sử dụng, không phải% TEMP%, ví dụ: plugin GWT cho Eclipse sử dụng biến% TMP%.
Wee Shetland

@Joshi: Câu trả lời của bạn khá chính xác. Tuy nhiên, tôi không đồng ý với ví dụ bạn đưa ra: Nếu người dùng đặt TMPenv var, thì giá trị TEMPsẽ bị bỏ qua. Vui lòng tham khảo câu trả lời của tôi và cho tôi biết nếu bạn không hiểu ý tôi.
Zakaria


33

Một mặt, khi bạn gọi System.getProperty("java.io.tmpdir")lệnh, Java sẽ gọi hàm của Win32 API GetTempPath. Theo MSDN :

Hàm GetTempPath kiểm tra sự tồn tại của các biến môi trường theo thứ tự sau và sử dụng đường dẫn đầu tiên được tìm thấy:

  1. Đường dẫn được chỉ định bởi biến môi trường TMP.
  2. Đường dẫn được chỉ định bởi biến môi trường TEMP.
  3. Đường dẫn được chỉ định bởi biến môi trường USERPROFILE.
  4. Thư mục Windows.

Mặt khác, hãy kiểm tra lý do lịch sử về lý do tại sao TMPTEMPcùng tồn tại . Nó thực sự đáng đọc.


0

Giá trị của %TEMP% biến môi trường thường dành cho người dùng cụ thể và Windows thiết lập nó liên quan đến tài khoản người dùng hiện đã đăng nhập. Một số tài khoản người dùng có thể không có hồ sơ người dùng, ví dụ như khi quá trình của bạn chạy như một dịch vụ trên SYSTEM, LOCALSYSTEMhoặc khác tích hợp trong tài khoản, hoặc được gọi bởi ứng dụng IIS với AppPool sắc với Tạo hồ sơ người dùng lựa chọn người tàn tật. Vì vậy, ngay cả khi bạn không ghi đè %TEMP%biến một cách rõ ràng, Windows có thể sử dụng c:\temphoặc thậm chí c:\windows\tempcác thư mục cho các tài khoản người dùng không bình thường. Và điều quan trọng hơn, tiến trình có thể không có quyền truy cập vào thư mục này!

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.