जावा में करंट डायरेक्टरी कैसे प्राप्त करें?


112

मान लीजिए कि मेरा मुख्य वर्ग है C:\Users\Justian\Documents\। मुझे यह दिखाने के लिए कि मेरा कार्यक्रम कैसे मिल सकता है C:\Users\Justian\Documents?

हार्ड-कोडिंग एक विकल्प नहीं है- यदि इसे किसी अन्य स्थान पर ले जाया जाए तो इसे अनुकूल बनाने की आवश्यकता है।

मैं एक फ़ोल्डर में सीएसवी फ़ाइलों का एक गुच्छा डंप करना चाहता हूं, कार्यक्रम को सभी फाइलों को पहचानना है, फिर डेटा लोड करना और उन्हें हेरफेर करना है। मैं वास्तव में सिर्फ उस फ़ोल्डर में नेविगेट करना चाहता हूं।


1
इस लेख पर एक नज़र डालें ।
मैथ्यू जे मॉरिसन

1
क्या होगा अगर आपका मुख्य वर्ग एक जार फ़ाइल में है? फिर आप किस तरह का परिणाम चाहते हैं?
मैटियस निल्सन

1
आपको कभी भी ऐसा करने की आवश्यकता क्यों होगी?
एड एस।

1
लगता है कि आपको क्या ज़रूरत है निर्देशिका CSV फाइलें हैं, और .jar फ़ाइल उस निर्देशिका को संदर्भित करने में सक्षम है, यदि ऐसा है तो मेरा जवाब देखें।

जवाबों:


149

सिस्टम प्रॉपर्टी का उपयोग करने का एक तरीका System.getProperty("user.dir");यह होगा कि यह आपको "वर्तमान कामकाजी निर्देशिका देगा जब गुण प्रारंभिक थे"। शायद यही आप चाहते हैं। यह पता लगाने के लिए कि javaआदेश कहाँ जारी किया गया था, निर्देशिका में आपके मामले में फाइलों के साथ प्रक्रिया करने के लिए, भले ही वास्तविक .jar फ़ाइल मशीन पर कहीं और रहती हो। वास्तविक .jar फ़ाइल की निर्देशिका होने से अधिकांश मामलों में यह उपयोगी नहीं है।

निम्न वर्तमान निर्देशिका को प्रिंट करेगा जहाँ कमांड को लागू किया गया था, जहाँ .class या .jar फ़ाइल .class फ़ाइल में है।

public class Test
{
    public static void main(final String[] args)
    {
        final String dir = System.getProperty("user.dir");
        System.out.println("current dir = " + dir);
    }
}  

यदि आप /User/me/और आपके .jar फ़ाइल में उपरोक्त कोड है, /opt/some/nested/dir/ तो कमांड java -jar /opt/some/nested/dir/test.jar Testआउटपुट होगा current dir = /User/me

आपको एक अच्छे ऑब्जेक्ट ओरिएंटेड कमांड लाइन तर्क पार्सर का उपयोग करके एक बोनस लुक के रूप में भी होना चाहिए। मैं JSAP , जावा सिंपल आर्ग्युमेंट पार्सर की अत्यधिक अनुशंसा करता हूं । यह आपको उपयोग करने System.getProperty("user.dir")और वैकल्पिक रूप से व्यवहार को ओवर-राइड करने के लिए किसी और चीज़ में पास करने देगा। एक बहुत अधिक बनाए रखने योग्य समाधान। यह निर्देशिका में पास करना आसान बना देगा, और user.dirयदि कुछ भी पारित नहीं हुआ तो वापस गिर सकता है।


जब मैं कर सकता हूँ तो मैं इसका परीक्षण करूँगा। मैं वास्तव में उस .jar मुद्दे के साथ व्यस्त हूँ: पी
जस्टियन मेयर

क्या आपने उस .jar मुद्दे के मेरे उत्तर में लिंक पर जाकर देखा, जहाँ मैं दिखाता हूँ कि .TT फ़ाइल को ANT के साथ कैसे बनाया जाए?

जारोड का वह कोड जो सिस्टम प्रॉपर्टी से करंट वर्किंग डाइरेक्टरी को निरपेक्ष पथ पर लौटाता है, user.dirका उपयोग करना बहुत आसान है। System.getProperty ( "user.dir");

74

का उपयोग करें CodeSource#getLocation()। यह JAR फ़ाइलों में भी ठीक काम करता है। आप CodeSourceद्वारा प्राप्त कर सकते हैंProtectionDomain#getCodeSource() औरProtectionDomain बदले में प्राप्त किया जा सकता Class#getProtectionDomain()

public class Test {
    public static void main(String... args) throws Exception {
        URL location = Test.class.getProtectionDomain().getCodeSource().getLocation();
        System.out.println(location.getFile());
    }
}

ओपी की टिप्पणी के अनुसार अपडेट करें :

मैं एक फ़ोल्डर में सीएसवी फ़ाइलों का एक गुच्छा डंप करना चाहता हूं, कार्यक्रम को सभी फाइलों को पहचानना है, फिर डेटा लोड करना और उन्हें हेरफेर करना है। मैं वास्तव में सिर्फ उस फ़ोल्डर में नेविगेट करना चाहता हूं।

आपके कार्यक्रम में उनके सापेक्ष पथ को जानना / जानना कठिन होगा। इसके बजाय क्लासपाथ पर अपना रास्ता जोड़ने पर विचार करें ताकि आप उपयोग कर सकेंClassLoader#getResource()

File classpathRoot = new File(classLoader.getResource("").getPath());
File[] csvFiles = classpathRoot.listFiles(new FilenameFilter() {
    @Override public boolean accept(File dir, String name) {
        return name.endsWith(".csv");
    }
});

या इसके मार्ग को main()तर्क के रूप में पारित करना ।


3
+1। इस काम को करने के लिए कई शर्तें हैं; सबसे महत्वपूर्ण यह है कि आपका "मुख्य वर्ग" फाइल सिस्टम से भरा हुआ है। जावा में, इस धारणा को असत्य होने के लिए यह बहुत असामान्य नहीं है। लेकिन, यदि आप सुनिश्चित करें कि आप फाइल सिस्टम पर एक जार से अपने वर्ग लोड कर रहे हैं कर रहे हैं, यह है विधि है कि काम करता है।
एरिकसन

यह सब निर्भर करता है, वास्तव में। मैं अपने JAR को संकलित करने की कोशिश कर रहा हूं , लेकिन इस समय एक अलग मुद्दा है। अगर आपको लगता है कि आप इसकी मदद कर सकते हैं, तो देखें: stackoverflow.com/questions/3152240/… । मुझे यकीन है कि यह पोस्ट करना किसी प्रकार का उल्लंघन है, लेकिन यह इस मुद्दे से संबंधित है। अगर मैं तय कर सकता हूं, तो यह निश्चित रूप से मेरा जवाब होगा।
जस्टियन मेयर

मुझे हार्डकोड की आवश्यकता क्यों होगी? मैंने पहले भी ऐसी ही बातें की हैं। मान लें कि मेरे जार और फ़ोल्डर में हमेशा एक जैसा रिश्ता (यानी एक ही डायरेक्टरी में) होगा। यदि यह सच था, मुझे जार की निर्देशिका मिल सकती है, तो इसे फ़ोल्डर खोजने के लिए संशोधित करें।
जस्टियन मेयर

यदि यह JAR फ़ाइल के समान फ़ोल्डर में है, तो यह पहले से ही क्लासपैथ में है। शब्द "हार्डकोडिंग" थोड़ा अतिरंजित है, मेरा वास्तव में मतलब था "जार फ़ाइल के सापेक्ष उनके पथ को जानना"।
BalusC

1
@ मोहब्बत: हुह? क्या आप जावा के लिए नए हैं? जावदोक की जाँच करें । बस ठीक उसी तरह का उपयोग करें जैसे कि getLocation()विधि द्वारा लौटाया गया है। अन्य स्पष्ट रूप से काम नहीं करने वाले हैं।
बालुस

31
File currentDirectory = new File(new File(".").getAbsolutePath());
System.out.println(currentDirectory.getCanonicalPath());
System.out.println(currentDirectory.getAbsolutePath());

प्रिंट कुछ इस तरह हैं:

/path/to/current/directory
/path/to/current/directory/.

ध्यान दें कि File.getCanonicalPath()एक जाँच IOException फेंकता है, लेकिन यह चीजों को हटा देगा ../../../


13
this.getClass().getClassLoader().getResource("").getPath()

ध्यान दें कि यह "बिन / वर्गों /" के लिए पथ को लौटाएगा, और सिर्फ "बिन" नहीं।
एंड्रॉइड डेवलपर

Intellij Idea का उपयोग करते हुए एक रनिंग एप्लिकेशन को डीबग करते हुए, यह "/C:/Program%20Files/Java/jdk1.8.0_112/:"
वेग से

5

मैंने अभी उपयोग किया है:

import java.nio.file.Path;
import java.nio.file.Paths;

...

Path workingDirectory=Paths.get(".").toAbsolutePath();

9
तुम्हारा यह काम नहीं कर रहा है, यह एक सही हैPaths.get("").toAbsolutePath();
To Kra

@ToKra अगर मुझे Paths.get("my/file").toAbsolutePath()मिलता है /my/file, जो निश्चित रूप से cwd नहीं है।
abergmeier

1
@abergmeier मैंने स्ट्रिंग में "my / file" नहीं "लिखा"
To Kra

5

यदि आप अपनी वर्तमान कार्यशील निर्देशिका प्राप्त करना चाहते हैं तो निम्न पंक्ति का उपयोग करें

System.out.println(new File("").getAbsolutePath());

4

यदि आप वर्तमान स्रोत कोड का पूर्ण पथ चाहते हैं, तो मेरा सुझाव है:

String internalPath = this.getClass().getName().replace(".", File.separator);
String externalPath = System.getProperty("user.dir")+File.separator+"src";
String workDir = externalPath+File.separator+internalPath.substring(0, internalPath.lastIndexOf(File.separator));

जब आप इसे IDE पर चलाते हैं या उदाहरण का उपयोग करने के लिए कुछ का उपयोग करते हैं तो यह काम नहीं करता है।
सर्प काया

आंतरिक पथ java \ lang \ Class है बाहरी पथ E: \ BranchProduct1.4.0 \ FilesTestProject \ src कार्य निर्देशिका E: \ BranchProduct1.4.0 \ FilesTestProject \ src \ java's lang क्या आप आउटपुट की व्याख्या कर सकते हैं?
जावा

3

कौन कहता है कि आपका मुख्य वर्ग किसी स्थानीय हार्डडिस्क पर फ़ाइल में है? कक्षाएं अक्सर JAR फ़ाइलों के अंदर बंडल की जाती हैं, और कभी-कभी नेटवर्क पर लोड की जाती हैं या यहां तक ​​कि मक्खी पर भी उत्पन्न होती हैं।

तो ऐसा क्या है जो आप वास्तव में करना चाहते हैं? शायद ऐसा करने का एक तरीका है जो वर्गों के बारे में धारणा नहीं बनाता है।


मैं एक फ़ोल्डर में सीएसवी फ़ाइलों का एक गुच्छा डंप करना चाहता हूं, कार्यक्रम को सभी फाइलों को पहचानना है, फिर डेटा लोड करना और उन्हें हेरफेर करना है। मैं वास्तव में सिर्फ उस फ़ोल्डर में नेविगेट करना चाहता हूं।
जस्टियन मेयर

शायद मुझे कुछ याद आ रहा है लेकिन ऐसा लगता है कि एक निरपेक्ष रास्ता काम करेगा। आपने कहा कि आप इसे हार्डकोड नहीं कर सकते, लेकिन आप यह कैसे जान पाएंगे कि किस फ़ोल्डर को शुरू करने के लिए देखना है?
क्रिस थॉम्पसन

खैर मुद्दा यह है कि मैं इसे केवल अपने ही नहीं, अन्य कंप्यूटरों पर लाना चाहता हूं। मैं यह नहीं देखता कि रास्ता कितना कठिन होगा। "यह मान लें कि मेरे जार और फ़ोल्डर में हमेशा एक जैसा रिश्ता होगा (यानी एक ही डायरेक्टरी में)। अगर यह सच था, तो मैं जार की निर्देशिका प्राप्त कर सकता था, फिर इसे फ़ोल्डर खोजने के लिए संशोधित करें।" एक ही रास्ता है कि मैं हार्डकोड कर सकता हूं, अगर मुझे हार्ड ड्राइव से फाइल तक पूरा रास्ता शामिल नहीं करना है। शायद मैं सिर्फ 3 फ़ोल्डर वापस जा सकता हूं (यानी "दस्तावेज़ \ प्रोजेक्ट \ डंप \ [फ़ाइल / फ़ोल्डर]")
जस्टियन मेयर

मैं कहूंगा कि आप जो करना चाहते हैं उसे उस निर्देशिका को संभालना है जो जार फ़ाइल में रहती है। क्या यह आपकी आवश्यकताओं को पूरा करेगा?
क्रिस थॉम्पसन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.