पर्यावरण चर java.io.tmpdir को नियंत्रित करने के लिए?


109

मैंने TMPपर्यावरण चर का उपयोग चीजों को नियंत्रित करने के लिए किया है, जहां gcc यह अस्थायी फ़ाइलें लिखता है, लेकिन मैं जावा के createTempFile API के लिए एक समान नहीं खोज सकता ।

क्या ऐसा वातावरण चर मौजूद है?


वास्तविक लिंक java.sun.com/javase/6/docs/api/java/io/… , java.lang.String, java.io.File) Stackoverflow सही काम नहीं करता है जब मैं उस URL को देखता हूं। (या जब मैं कोष्ठक को 28% और 29% के साथ प्रतिस्थापित करता हूं)। मुझे पता है कि छोटे url का उपयोग करना बेकार है, लेकिन मुझे लगा कि यह बिना किसी लिंक के बेहतर था।
ज़ाच हिर्श

मैंने लिंक ठीक कर दिया। एसओ ठीक काम करता है ठीक है।
rmeador 20

1
धन्यवाद। मुझे लगता है कि चाल भी 20% के साथ रिक्त स्थान की जगह किया गया था
ज़ैक हिर्श

1
मैंने केवल आपके लिंक का अनुसरण किया था, अपने ब्राउज़र के एड्रेस बार से URL को कॉपी करें, और उसे अपनी पोस्ट में पेस्ट करें जहां आपका छोटा लिंक था।
rmeador 20

जवाबों:


118

हम्म - चूँकि यह JVM द्वारा संभाला जाता है, इसलिए मैंने OpenJDK VM स्रोत कोड में थोड़ा सा बदलाव किया, यह सोचकर कि शायद OpenJDK mimics द्वारा क्या किया गया है जो कि Java 6 और पूर्व द्वारा किया गया है। यह आश्वस्त नहीं है कि विंडोज पर इसके अलावा ऐसा करने का कोई तरीका है।

पर विंडोज , OpenJDK के get_temp_directory()कार्य करने के लिए एक Win32 API कॉल करता है GetTempPath(); यह विंडोज पर है, जावा TMPपर्यावरण चर के मूल्य को दर्शाता है ।

पर लिनक्स और सोलारिस , एक ही get_temp_directory()कार्य के लिए एक स्थिर मान /tmp/

मैं नहीं जानता कि क्या वास्तविक JDK6 इन सटीक सम्मेलनों का अनुसरण करता है, लेकिन प्रत्येक सूचीबद्ध प्लेटफार्मों पर व्यवहार के द्वारा, ऐसा लगता है कि वे ऐसा करते हैं।


38
स्पष्ट होने के लिए, आप जो देख रहे हैं वह मूल कोड है जो "java.io.tmpdir" संपत्ति के लिए डिफ़ॉल्ट मान प्रदान करता है जब JVM सिस्टम गुण ऑब्जेक्ट बनाता है। यह (उदाहरण के लिए) "-jj.io.tmpdir = ..." विकल्प द्वारा ओवरराइड किया जाएगा।
स्टीफन सी

6
@StephenC, हां, यह बात है - ओपी यह देख रहा था कि संपत्ति के लिए डिफ़ॉल्ट मान इसे स्वयं स्थापित करने के अभाव में कैसे सेट हो जाता है ( -Djava.io.tmpdirकमांड लाइन विकल्प के माध्यम से JVM के लिए), और यदि डिफ़ॉल्ट मान प्रभावित होता है सभी एक पर्यावरण मूल्य द्वारा। जैसा कि लोगों ने देखा था, विंडोज पर यह पर्यावरण चर से प्रभावित है TMP, लेकिन यह स्पष्ट नहीं था कि क्या अन्य ओएस के लिए कुछ अज्ञात चर था। ऐसा लगता है कि वहाँ नहीं है, कम से कम हमें क्या OpenJDK के बारे में पता है।
डेफ्यूगो

5
अच्छा जवाब है, लेकिन विंडोज GetTempPath()केवल TMPपर्यावरण चर से प्रभावित नहीं है : msdn.microsoft.com/en-us/library/aa364992%28VS.85%29.aspx
Dan Berindei

मैंने देखा है कि Solaris Sun JDK पर वैल्यू /var/tmp/(प्रमुख स्लैश के साथ) है, उसके लिए बग # 4391434 भी है। और मैक ओएस और लिनक्स के लिए यह है/tmp - क्या गड़बड़ है!
dma_k

1
@Znik साथ काम करता है oracle-java8-jdk=8u102(लिनक्स)
एलेक्स

118

जावा डॉक्स के अनुसारjava.io.File

डिफ़ॉल्ट अस्थायी-फ़ाइल निर्देशिका को सिस्टम प्रॉपर्टी java.io.tmpdir द्वारा निर्दिष्ट किया जाता है। UNIX प्रणालियों पर इस संपत्ति का डिफ़ॉल्ट मूल्य आमतौर पर "/ tmp" या "/ var / tmp" होता है; Microsoft Windows सिस्टम पर यह आमतौर पर "c: \ temp" है। जावा वर्चुअल मशीन के आने पर इस सिस्टम प्रॉपर्टी को एक अलग मान दिया जा सकता है, लेकिन इस प्रॉपर्टी के प्रोग्रामेटिक बदलावों को इस पद्धति द्वारा उपयोग किए जाने वाले अस्थायी डायरेक्टरी पर कोई प्रभाव नहीं पड़ने की गारंटी नहीं है।

java.io.tmpdirसिस्टम प्रॉपर्टी को निर्दिष्ट करने के लिए , आप जेवीएम को निम्नानुसार लागू कर सकते हैं:

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

डिफ़ॉल्ट रूप से यह मान TMPविंडोज सिस्टम पर पर्यावरण चर से आना चाहिए


1
यह मेरे सवाल का जवाब नहीं है। क्या कोई पर्यावरण चर है जो इसे नियंत्रित करता है?
ज़ैक हिर्श

3
आपके संपादन के बावजूद, ब्रायन, java.io.tmpdir निश्चित रूप से मैक पर या उबंटू (6.06 पर परीक्षण) पर TMPDIR पर्यावरण चर का पालन नहीं करता है।
डेफ्यूगो

ओए, और एक और संपादन, इन सभी टिप्पणियों को निरर्थक लगता है।
डेफ्यूगो

@Zach। इसका उत्तर प्लेटफॉर्म विशिष्ट है।
स्टीफन सी

12
यह इतना आसान नहीं है और यह जवाब अभी भी गलत है। Windows पर, java.io.tmpdirWindows SDK फ़ंक्शन GetTempPath( msdn.microsoft.com/en-us/library/aa364992%28VS.85%29.aspx ) का उपयोग करके परिभाषित किया गया है , जो TMP या TEMP या USERPROFILE या Windows निर्देशिका में से प्रत्येक के लिए हल होगा पिछला परिभाषित नहीं है।
पास्कल थिवेंट

62

आप अपना _JAVA_OPTIONSपर्यावरण चर सेट कर सकते हैं। उदाहरण के लिए बाश में यह चाल होगी:

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

मैंने अपनी बैश लॉगिन स्क्रिप्ट में डाल दिया है और यह चाल करने के लिए लगता है।


3
जबकि यह लिनक्स और मैकओएसएक्स पर काम करता है, इसका हर जावा लॉन्च पर कुछ अतिरिक्त आउटपुट को प्रिंट करने का दुर्भाग्यपूर्ण दुष्प्रभाव है: Picked up _JAVA_OPTIONS:यह पूरी तरह से हमारी निर्माण प्रक्रिया को भ्रमित करता है।
margguenther

3
मैंने इस जवाब को वोट दिया क्योंकि यह उपयोगकर्ताओं के सवाल का जवाब देता है और उपयोगकर्ता ने ओएस निर्दिष्ट नहीं किया या किसी अन्य पक्ष को प्रभावित नहीं करना चाहता था। मेरा मानना ​​है कि इसे सर्वश्रेष्ठ उत्तर के रूप में सेट किया जाना चाहिए
आर। वैन ट्विस्क

3
यह चर सन JVM के लिए विशिष्ट प्रतीत होता है - आईबीएम J9 JVM इसका समर्थन नहीं करता है; इसके बजाय IBM_JAVA_OPTIONS का समर्थन करता है
sendmoreinfo

@sendmoreinfo, यह मेरी जानकारी के लिए Sun / Oracle और OpenJDK के लिए काम करता है।
जॉन सेंट जॉन

1
पर्यावरण चर के बीच अंतर के बारे में इस उत्तर के अनुसार , JAVA_TOOL_OPTIONSअधिक पोर्टेबल है।
एंडलोस स्क्लेफ़ाइफ़


28

यह एक पर्यावरण चर नहीं है, लेकिन फिर भी आपको अस्थायी नियंत्रण पर नियंत्रण देता है:

-Djava.io.tmpdir

पूर्व .:

java -Djava.io.tmpdir=/mytempdir

17

यहाँ क्या हो रहा है इसके बारे में स्पष्ट होना:

  • अस्थायी निर्देशिका स्थान सेट करने का अनुशंसित तरीका "java.io.tmpdir" नामक सिस्टम गुण सेट करना है, उदाहरण -Djava.io.tmpdir=/mytempdirके लिए javaकमांड का विकल्प देकर । प्रॉपर्टी को प्रोग्राम के भीतर से कॉल करके भी बदला जा सकता है System.setProperty("java.io.tmpdir", "/mytempdir)... modulo sandbox सुरक्षा मुद्दे।

  • यदि आप स्टार्टअप पर "java.io.tmpdir" संपत्ति को स्पष्ट रूप से सेट नहीं करते हैं, तो JVM इसे एक प्लेटफ़ॉर्म विशिष्ट डिफ़ॉल्ट मान पर प्रारंभ करता है । Windows के लिए, डिफ़ॉल्ट को Win32 API विधि के लिए कॉल द्वारा प्राप्त किया जाता है। लिनक्स / सोलारिस के लिए डिफ़ॉल्ट रूप से स्पष्ट रूप से हार्ड-वायर्ड है। अन्य JVM के लिए यह कुछ और हो सकता है।

व्यावहारिक रूप से, "टीएमपी" पर्यावरण चर विंडोज (वर्तमान जेवीएम के साथ) पर काम करता है, लेकिन अन्य प्लेटफार्मों पर नहीं। यदि आप पोर्टेबिलिटी की परवाह करते हैं, तो आपको स्पष्ट रूप से सिस्टम प्रॉपर्टी सेट करनी चाहिए।


2

UNIX टर्मिनल पर कमांड के नीचे प्रयोग करें:

java -XshowSettings

यह सभी जावा गुण और सिस्टम सेटिंग्स प्रदर्शित करेगा। इस में java.io.tmpdirमूल्य के लिए देखो ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.