Kapan System.getProperty ("java.io.tmpdir") mengembalikan "c: \ temp"

110

Hanya ingin tahu kapan System.getProperty("java.io.tmpdir")kembali "c:\temp". Menurut java.io.File Java Docs -

Direktori file sementara default ditentukan oleh properti sistem java.io.tmpdir. Pada sistem UNIX, nilai default dari properti ini biasanya adalah "/ tmp" atau "/ var / tmp"; pada sistem Microsoft Windows biasanya "c: \ temp". Nilai yang berbeda dapat diberikan ke properti sistem ini saat mesin virtual Java dipanggil, tetapi perubahan programatik pada properti ini tidak dijamin akan berdampak pada direktori sementara yang digunakan oleh metode ini.

Tapi dalam kasus saya-

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

Selalu kembali-

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

Dalam kondisi apa ia akan kembali "c:\temp"?

DIEDIT: Jika saya mengubah% TEMP% ke C: \ Temp maka saya akan mendapatkan C: \ Temp, bukan? Tapi dokumentasinya menunjukkan c: \ Temp, bukan C: \ Temp.

Ashish Pancholi
sumber
4
en.wikipedia.org/wiki/T sementara_folder Melihat wiki, menurut saya Anda dapat membuatnya C:\Tempdengan mengubah% TEMP%, menginstal Windows 98 atau meneruskannya ke java -Djava.io.tmpdir=C:\Temp. Lihat juga ini: stackoverflow.com/questions/3437095/…
bezmax
@Ax Terima kasih MAX. Jika saya mengubah% TEMP% menjadi C:\Tempmaka saya akan mendapatkannya C:\Temp. Baik? tapi acara dok, c:\Tempbukan C:\Temp. :)
Ashish Pancholi
2
saya tidak tahu mengapa huruf drive penting dengan aplikasi Anda?
ajduke
@AshishPancholi tidak membawa Anda ke sana?
ajduke
1.4.2 Javadoc yang Anda tautkan sudah usang. 7 Javadoc saat ini menyebutkan direktori "tipikal" dari "C:\\WINNT\\TEMP".
Abdull

Jawaban:

128

Di MS Windows, direktori sementara diatur oleh variabel lingkungan TEMP. Di XP, direktori sementara ditetapkan per pengguna sebagai Pengaturan Lokal \ Temp.

Jika Anda mengubah variabel lingkungan TEMP menjadi C:\temp, maka Anda mendapatkan yang sama saat Anda menjalankan:

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

Madhusudan Joshi
sumber
2
Di Windows ada variabel lingkungan kedua yang disebut% TMP% dan inilah yang terkadang digunakan, bukan% TEMP%, misalnya plugin GWT untuk Eclipse menggunakan variabel% TMP%.
Wee Shetland
@Joshi: Jawaban Anda cukup akurat. Namun, saya tidak setuju dengan contoh yang Anda berikan: Jika pengguna menyetel TMPenv var, maka TEMPakan diabaikan. Tolong, lihat jawaban saya dan beri tahu saya jika Anda tidak mengerti apa yang saya maksud.
Zakaria
38

Jika Anda mengatur

-Djava.io.tmpdir=C:\temp
Peter Lawrey
sumber
17
Nama file Windows tidak membedakan huruf besar / kecil.
Peter Lawrey
33

Di satu sisi, saat Anda memanggil System.getProperty("java.io.tmpdir")instruksi, Java memanggil fungsi Win32 API GetTempPath. Menurut MSDN :

Fungsi GetTempPath memeriksa keberadaan variabel lingkungan dalam urutan berikut dan menggunakan jalur pertama yang ditemukan:

  1. Jalur yang ditentukan oleh variabel lingkungan TMP.
  2. Jalur yang ditentukan oleh variabel lingkungan TEMP.
  3. Jalur yang ditentukan oleh variabel lingkungan USERPROFILE.
  4. Direktori Windows.

Di sisi lain, periksa alasan historis tentang mengapa TMPdan TEMPhidup berdampingan . Ini sangat berharga untuk dibaca.

Zakaria
sumber
0

Nilai %TEMP%variabel lingkungan sering kali khusus pengguna dan Windows mengaturnya sehubungan dengan akun pengguna yang saat ini masuk. Beberapa akun pengguna mungkin tidak memiliki profil pengguna, misalnya ketika proses Anda berjalan sebagai layanan pada SYSTEM, LOCALSYSTEMatau akun bawaan lainnya, atau dipanggil oleh aplikasi IIS dengan identitas AppPool dengan opsi Buat profil pengguna dinonaktifkan. Jadi, meskipun Anda tidak menimpa %TEMP%variabel secara eksplisit, Windows dapat menggunakan c:\tempatau bahkan c:\windows\tempfolder untuk, katakanlah, akun pengguna yang tidak biasa. Dan yang lebih penting, proses mungkin tidak memiliki hak akses ke direktori ini!

Maciek
sumber