2009-08-05 12 views
6

लगभग हर लेख मैंने पढ़ा है कि आपको जावा में chdir नहीं हो सकता है। this question के स्वीकृत उत्तर का कहना है कि आप इसे जावा में नहीं कर सकते हैं।जावा में काम कर रहे user.dir सिस्टम प्रॉपर्टी क्यों है?

हालांकि, यहां सामान मैंने कोशिश से कुछ है:

 
[email protected]:~$ java -version 
java version "1.6.0_14" 
Java(TM) SE Runtime Environment (build 1.6.0_14-b08) 
Java HotSpot(TM) Client VM (build 14.0-b16, mixed mode, sharing) 

यहाँ एक परीक्षण वर्ग मैं उपयोग कर रहा हूँ है:

import java.io.*; 

public class Ch { 
    public static void main(String[] args) { 
     System.out.println(new File(".").getAbsolutePath()); 
     System.setProperty("user.dir","/media"); 
     System.out.println(new File(".").getAbsolutePath()); 
    } 
} 
 
[email protected]:~$ pwd 
/home/geo 
[email protected]:~$ java Ch 
/home/geo/. 
/media/. 

कृपया बताएं कि इस काम किया। क्या मैं इसे अब से उपयोग कर सकता हूं और उम्मीद करता हूं कि यह सभी प्लेटफॉर्म पर उसी तरह काम करे?

उत्तर

10

सिर्फ इसलिए कि new File(".") वांछित उत्तर देता है इसका मतलब यह नहीं है कि यह वही कर रहा है जो आप चाहते हैं।

उदाहरण के लिए, कोशिश:

new FileOutputStream("foo.txt").close(); 

कहाँ है कि अंत तक करता है? मेरे विंडोज बॉक्स पर, भले ही new File(".").getAbsolutePath()user.dir के आधार पर घूमता है, foo.txt हमेशा मूल कार्य निर्देशिका में बनाया जाता है। यह मुझे मारता है कि user.dir को सेट करना new File(".") वर्तमान कार्य निर्देशिका का संदर्भ केवल परेशानी के लिए पूछ रहा है।

+0

मैंने इसका परीक्षण नहीं किया :)। मैंने रोका जब मैंने देखा कि user.dir प्रॉपर्टी को बदलना फ़ाइल क्लास द्वारा प्रतिबिंबित होता है। – Geo

+1

ऐसा है ... तो ... तो ... *** गलत ***। :-) –

6

उद्धरण:

user.dir संपत्ति वीएम स्टार्टअप पर सेट कर दिया जाता कार्यशील निर्देशिका किया जाना है। आपको इस संपत्ति को नहीं बदलना चाहिए या इसे कमांड लाइन पर सेट नहीं करना चाहिए। यदि आप करते हैं, तो आप कुछ असंगत व्यवहार देखेंगे क्योंकि कार्यान्वयन में ऐसे स्थान हैं जो मानते हैं कि user.dir कार्यशील निर्देशिका है और यह वीएम के जीवनकाल में नहीं बदलता है।

चर्चा here

1

File.getAbsoluteFile() सिर्फ user.dir प्रणाली संपत्ति है, जो वीएम स्टार्टअप पर प्रक्रिया के कार्यशील निर्देशिका की एक प्रति है पर देख रहा है।

एक बेहतर परीक्षण यह जांचने के लिए हो सकता है कि प्रक्रिया की कार्यशील निर्देशिका वास्तव में बदल रही है। आप इस मंच से भिन्न होता है, लेकिन लिनक्स पर आप की तरह कुछ करने कर सकते हैं कैसे कर सकते हैं:

$ ls -l /proc/18037/cwd 
lrwxrwxrwx 1 laurence laurence 0 2009-08-05 11:16 /proc/18037/cwd -> /home/laurence/ 

जहां "18037" प्रश्न में प्रक्रिया की पीआईडी ​​है। यदि आप ऐसा करते हैं तो मुझे विश्वास है कि आप पाएंगे कि जब आप user.dir को अपडेट करते हैं तो प्रक्रिया की कार्य निर्देशिका वास्तव में परिवर्तित नहीं होती है।

संबंधित मुद्दे