Variabel lingkungan untuk mengontrol java.io.tmpdir?

110

Saya telah menggunakan TMPvariabel lingkungan untuk mengontrol hal-hal seperti di mana gcc menulis file sementara itu, tetapi saya tidak dapat menemukan padanan untuk API createTempFile java .

Apakah ada variabel lingkungan seperti itu?

Zach Hirsch
sumber
Tautan sebenarnya adalah java.sun.com/javase/6/docs/api/java/io/… , java.lang.String, java.io.File) Stackoverflow tidak melakukan hal yang benar saat saya memasukkan URL tersebut (atau saat saya mengganti tanda kurung dengan% 28 dan% 29). Saya tahu menggunakan url pendek itu menyebalkan, tetapi saya pikir itu lebih baik daripada tidak ada tautan sama sekali.
Zach Hirsch
Saya memperbaiki tautannya. JADI melakukan hal yang benar dengan baik.
rmeador
1
Terima kasih. Saya kira triknya juga mengganti spasi dengan% 20
Zach Hirsch
1
yang saya lakukan hanyalah mengikuti tautan Anda, menyalin URL dari bilah alamat browser saya, dan menempelkannya ke kiriman Anda di mana tautan singkat Anda berada.
rmeador

Jawaban:

118

Hmmm - karena ini ditangani oleh JVM, saya mempelajari kode sumber VM OpenJDK sedikit, berpikir bahwa mungkin apa yang dilakukan oleh OpenJDK meniru apa yang dilakukan oleh Java 6 dan sebelumnya. Tidak dapat dipastikan bahwa ada cara untuk melakukan ini selain di Windows.

Pada Windows , get_temp_directory()fungsi OpenJDK membuat panggilan API Win32 ke GetTempPath(); Beginilah cara pada Windows, Java mencerminkan nilai TMPvariabel lingkungan.

Di Linux dan Solaris , get_temp_directory()fungsi yang sama mengembalikan nilai statis /tmp/.

Saya tidak tahu apakah JDK6 yang sebenarnya mengikuti konvensi yang tepat ini, tetapi berdasarkan perilaku di masing-masing platform yang terdaftar, sepertinya memang demikian.

delfuego.dll
sumber
39
Agar jelas, yang Anda lihat adalah kode asli yang memberikan nilai default untuk properti "java.io.tmpdir" saat JVM membuat objek properti Sistem. Ini akan diganti dengan (misalnya) opsi "-Djava.io.tmpdir = ...".
Stephen C
6
@StephenC, ya, itulah intinya - OP sedang mencari bagaimana nilai default untuk properti diatur tanpa adanya pengaturan sendiri (melalui -Djava.io.tmpdiropsi baris perintah ke JVM), dan jika nilai default itu terpengaruh di semua dengan nilai lingkungan. Sebagai orang telah diamati, pada Windows itu adalah dipengaruhi oleh TMPvariabel lingkungan, tetapi tidak jelas apakah ada beberapa variabel yang tidak diketahui untuk OS lainnya. Sepertinya tidak ada, setidaknya mengingat apa yang kami ketahui tentang OpenJDK.
delfuego
5
Jawaban bagus, tetapi di Windows GetTempPath()tidak hanya dipengaruhi oleh TMPvariabel lingkungan: msdn.microsoft.com/en-us/library/aa364992%28VS.85%29.aspx
Dan Berindei
Saya telah melihat bahwa di Solaris Sun JDK nilainya /var/tmp/(dengan garis miring), bahkan ada bug # 4391434 untuk itu. Dan untuk Mac OS dan Linux itu/tmp - sungguh berantakan!
dma_k
1
@Znik bekerja dengan oracle-java8-jdk=8u102(linux)
Alex
118

Menurut java.io.FileJava 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.

Untuk menentukan java.io.tmpdirproperti Sistem, Anda dapat menjalankan JVM sebagai berikut:

java -Djava.io.tmpdir=/path/to/tmpdir

Secara default, nilai ini harus berasal dari TMPvariabel lingkungan pada sistem Windows

Bryan Kyle
sumber
1
Ini tidak menjawab pertanyaan saya. Apakah ada variabel lingkungan yang mengontrol ini?
Zach Hirsch
3
Meskipun Anda mengedit, Bryan, java.io.tmpdir jelas tidak mengikuti variabel lingkungan TMPDIR di Mac atau di Ubuntu (diuji pada 6.06).
delfuego
Oy, dan suntingan lainnya, membuat semua komentar ini tampak tidak masuk akal.
delfuego
@Ach. Jawabannya adalah untuk platform tertentu.
Stephen C
12
Tidak sesederhana itu dan jawaban ini masih salah. Di Windows, java.io.tmpdirditentukan dengan menggunakan fungsi SDK Windows GetTempPath( msdn.microsoft.com/en-us/library/aa364992%28VS.85%29.aspx ) yang akan menyelesaikan ke TMP atau TEMP atau USERPROFILE atau direktori Windows jika masing-masing sebelumnya tidak ditentukan.
Pascal Thivent
62

Anda dapat mengatur _JAVA_OPTIONSvariabel lingkungan Anda . Misalnya di bash ini akan melakukan triknya:

export _JAVA_OPTIONS=-Djava.io.tmpdir=/new/tmp/dir

Saya memasukkannya ke dalam skrip login bash saya dan sepertinya berhasil.

John St. John
sumber
3
Meskipun ini tampaknya berfungsi di Linux dan MacOSX, ini memiliki efek samping yang tidak menguntungkan dari mencetak beberapa keluaran tambahan pada setiap peluncuran java: Picked up _JAVA_OPTIONS:Ini benar-benar membingungkan proses pembuatan kami.
marc.guenther
3
Saya memilih jawaban ini karena menjawab pertanyaan pengguna dan pengguna tidak menentukan OS atau ingin menghindari pengaruh pihak lain. Saya percaya ini harus ditetapkan sebagai jawaban terbaik
R. van Twisk
3
Variabel ini tampaknya khusus untuk Sun JVM - jika IBM J9 JVM tidak mendukungnya; itu mendukung IBM_JAVA_OPTIONS sebagai gantinya
sendmoreinfo
@sendmoreinfo, ini berfungsi untuk Sun / Oracle dan OpenJDK menurut pengetahuan saya.
John St. John
1
Menurut jawaban tentang perbedaan antara variabel lingkungan, JAVA_TOOL_OPTIONSlebih portabel.
EndlosSchleife
38

Menggunakan

$ java -XshowSettings
Property settings:
    java.home = /home/nisar/javadev/javasuncom/jdk1.7.0_17/jre
    java.io.tmpdir = /tmp
Nisar Ahmed
sumber
28

Ini bukan variabel lingkungan, tetapi tetap memberi Anda kendali atas dir temp:

-Djava.io.tmpdir

ex.:

java -Djava.io.tmpdir=/mytempdir
Bozho
sumber
17

Untuk memperjelas tentang apa yang terjadi di sini:

  • Cara yang disarankan untuk menyetel lokasi direktori sementara adalah dengan menyetel properti Sistem bernama "java.io.tmpdir", misalnya dengan memberikan opsi -Djava.io.tmpdir=/mytempdirke javaperintah. Properti ini juga dapat diubah dari dalam program dengan memanggil System.setProperty("java.io.tmpdir", "/mytempdir)... masalah keamanan sandbox modulo.

  • Jika Anda tidak secara eksplisit menyetel properti "java.io.tmpdir" saat memulai, JVM akan menginisialisasi ke nilai default khusus platform . Untuk Windows, default diperoleh dengan panggilan ke metode API Win32. Untuk Linux / Solaris defaultnya tampaknya terprogram. Untuk JVM lain, ini bisa menjadi sesuatu yang lain.

Secara empiris, variabel lingkungan "TMP" berfungsi di Windows (dengan JVM saat ini), tetapi tidak di platform lain. Jika Anda peduli dengan portabilitas, Anda harus menyetel properti sistem secara eksplisit.

Stephen C
sumber
2

Gunakan perintah di bawah ini pada terminal UNIX:

java -XshowSettings

Ini akan menampilkan semua properti java dan pengaturan sistem. Dalam mencari java.io.tmpdirnilai ini.

suhas
sumber