जावा में वर्तमान कामकाजी निर्देशिका कैसे प्राप्त करें?


1024

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

मेरा कोड:

 String current = new java.io.File( "." ).getCanonicalPath();
        System.out.println("Current dir:"+current);
 String currentDir = System.getProperty("user.dir");
        System.out.println("Current dir using System:" +currentDir);

आउटपुट:

Current dir: C:\WINDOWS\system32
Current dir using System: C:\WINDOWS\system32

मेरा आउटपुट सही नहीं है क्योंकि C ड्राइव मेरी वर्तमान निर्देशिका नहीं है।

वर्तमान निर्देशिका कैसे प्राप्त करें?


2
जब आप cdअपने कमांड-प्रॉम्प्ट पर कमांड निष्पादित करते हैं तो क्या आप इसे यहां देख सकते हैं ?
निशांत

3
वह क्या है जिसे आप कार्यशील निर्देशिका तक पहुँच कर पूरा करने का प्रयास कर रहे हैं? क्या इसके बजाय वर्ग पथ का उपयोग करके ऐसा किया जा सकता है? उदाहरण के लिए, यदि आपको फ़ाइल सिस्टम पर एक पाठ फ़ाइल पढ़ने की आवश्यकता है, तो आप इसे आसानी से पा सकते हैं जब यह क्लास पथ पर है।
ईयरडूगल

1
कैसे? क्या आप कृपया विस्तार से बता सकते हैं?
सी ग्राफिक्स

1
वर्ग पथ पर किसी फ़ाइल तक पहुँचने के बारे में कुछ जानकारी के लिए, stackoverflow.com/questions/1464291/…

7
डिबगिंग उद्देश्यों के लिए, कार्यशील निर्देशिका यह जानने के लिए उपयोगी हो सकती है कि क्या प्रोग्राम मौजूद फ़ाइलों को एक्सेस करने में सक्षम नहीं है।
nsandersen

जवाबों:


1149
public class JavaApplication {
  public static void main(String[] args) {
       System.out.println("Working Directory = " + System.getProperty("user.dir"));
  }
}

यह एक पूर्ण निरपेक्ष पथ मुद्रित करेगा जहाँ से आपका आवेदन आरम्भ किया गया था।


से प्रलेखन :

java.ioपैकेज वर्तमान उपयोगकर्ता निर्देशिका का उपयोग करके सापेक्ष पथनामों को हल करता है। वर्तमान निर्देशिका को सिस्टम प्रॉपर्टी के रूप में दर्शाया गया है, user.dirऔर वह निर्देशिका है जहां से JVM को लागू किया गया था।


25
@ubuntudroid: यही कारण है कि मैंने विशेष रूप से उल्लेख किया है कि यह उस पथ को प्रिंट करेगा जहां से आवेदन ने प्रारंभ किया था। मेरा अनुमान है कि स्टार्टर स्टार्टर सीधे कॉमन प्रॉम्प्ट (जो मूल रूप से C: \ WINDOWS \ system32 पर है) शुरू करने के बाद जार / प्रोग्राम चलाते हैं। मुझे उम्मीद है कि आप मेरी बात समझेंगे। आपको नीचा दिखाते हुए, मान लें कि कम से कम आपने प्रतिक्रिया छोड़ने की परवाह की है। :)
अनुज पटेल

1
user.dir उस फ़ोल्डर को पथ प्राप्त करेगा जिसमें प्रक्रिया शुरू की गई थी। एप्लिकेशन के मुख्य फ़ोल्डर में वास्तविक पथ प्राप्त करने के लिए नीचे मेरा उत्तर देखें।
पीटर डे विंटर

1
मेरा मतलब है " वर्तमान निर्देशिका को विफल करने के लिए उस पर निर्भर सभी कोड विफल हो जाते हैं।" सामान्य रूप से सभी कोड नहीं। (मैं मूल टिप्पणी को संपादित करने के लिए धीमा था)
सबऑप्टिमल

13
अगर उपयोगकर्ता -SusOptimal का निपटान करता है, तो -Duser.dir, यह बताता है कि वह कस्टम वर्किंग डायरेक्टरी में इसे चलाना चाहता है।
बार्वनिक

5
@indyaah इस उत्तर को गलत मानता है, उपयोगकर्ता-वर्किंग-डायरेक्टरी और सिस्टम-प्रोसेस की वर्तमान-वर्किंग-डायरेक्टरी (cwd) के बीच एक सूक्ष्म अंतर है; अधिकांश समय "user.dir" एक (जावा) प्रक्रिया के cwd को इंगित करता है; लेकिन "user.dir" में अलग-अलग शब्दार्थ हैं और इसका उपयोग जावा प्रक्रिया के cwd को प्राप्त करने के लिए नहीं किया जाएगा; btw: जावा प्रक्रिया के लिए अधिक गुण उपलब्ध हैं docs.oracle.com/javase/tutorial/essential/environment/… सिर्फ संदर्भ के लिए
आने वाली

380

देखें: http://docs.oracle.com/javase/tutorial/essential/io/pathOps.html

उपयोग करना java.nio.file.Pathऔर java.nio.file.Paths, आप यह दिखाने के लिए निम्न कर सकते हैं कि जावा क्या सोचता है कि आपका वर्तमान मार्ग है। यह 7 और उसके लिए, और NIO का उपयोग करता है।

Path currentRelativePath = Paths.get("");
String s = currentRelativePath.toAbsolutePath().toString();
System.out.println("Current relative path is: " + s);

यह आउटपुट करता है Current relative path is: /Users/george/NetBeansProjects/Tutorialsकि मेरे मामले में मैं कहाँ से क्लास चलाता हूँ। एक रिश्तेदार रास्ते में निर्माण पथ, एक विभाजक विभाजक का उपयोग नहीं करने के लिए इंगित करने के लिए आप एक निरपेक्ष पथ का निर्माण कर रहे हैं, इस सापेक्ष पथ का उपयोग शुरुआती बिंदु के रूप में करेंगे।


2
पहले एक हेवन की जाँच नहीं की गई, लेकिन दूसरा वास्तव में आपके होम फोल्डर को प्राप्त करेगा। वर्तमान कार्य निर्देशिका नहीं जिसमें अनुप्रयोग चल रहा हो।
पीटर डे विंटर

12
कृपया उपयोगकर्ता के होम डायरेक्टरी ("user.home", / Users / george को आपके मामले में) और वर्तमान कार्य निर्देशिका ("user.dir") को भ्रमित न करें, जो कि वह निर्देशिका होगी जिसमें से आपने अपने आवेदन के लिए JVM शुरू किया था। , इसलिए कुछ इस तरह हो सकता है जैसे / उपयोगकर्ता / भू / कार्यक्षेत्र / FooBarProject)।
डेविड

1
मैं इस तरह से पसंद करता हूं। जब मुझे काम करने वाली निर्देशिका के माता-पिता की आवश्यकता होती है, तो यह काम नहीं करता है: Paths.get("").getParent()यह देता है null। इसके बजाय यह काम करता है: Paths.get("").toAbsolutePath().getParent()
ओले वीवी

235

निम्नलिखित जावा 7 और ऊपर काम करता है ( प्रलेखन के लिए यहां देखें )।

import java.nio.file.Paths;

Paths.get(".").toAbsolutePath().normalize().toString();

11
यह अधिक पोर्टेबल से बेहतर कैसे है import java.io.File; File(".").getAbsolutePath()?
इवगेनी सर्गेव

8
जब आप पोर्टेबल कहते हैं, तो इसका मतलब है कि यह जावा 6 और उससे पहले काम करता है? Paths.get()इसमें बेहतर माना जा सकता है कि यह अधिक शक्तिशाली Pathइंटरफ़ेस तक सीधी पहुँच प्रदान करता है।
ओले वीवी

8
.normalize()इस संदर्भ में उपयोग करने का संभावित लाभ क्या है ?
ओले वीवी

7
@ OleV.V। जावदोक से: ( सामान्य करने की विधि )Returns a path that is this path with redundant name elements eliminated.
स्टीफन

इस मामले में पहले से ही सामान्यीकृत किया जाएगा।
जेएम बेकर

72

इससे आपको अपनी वर्तमान कार्यशील निर्देशिका का मार्ग मिलेगा:

Path path = FileSystems.getDefault().getPath(".");

और यह आपको कार्यशील निर्देशिका में "Foo.txt" नामक एक फ़ाइल का मार्ग देगा:

Path path = FileSystems.getDefault().getPath("Foo.txt");

संपादित करें: वर्तमान निर्देशिका का एक पूर्ण मार्ग प्राप्त करने के लिए:

Path path = FileSystems.getDefault().getPath(".").toAbsolutePath();

* अद्यतन * वर्तमान काम कर निर्देशिका प्राप्त करने के लिए:

Path path = FileSystems.getDefault().getPath("").toAbsolutePath();

11
यह सिर्फ 'लौटाता है।' मेरे लिए।
जॉन ktejik

3
हां, कई प्रणालियों में जो कार्यशील निर्देशिका का संदर्भ होगा। पूर्ण पथ प्राप्त करने के लिए आप एक और विधि कॉल जोड़ सकते हैंPath path = FileSystems.getDefault().getPath(".").toAbsolutePath();
मार्क

2
तुम
foo.txt की

1
विंडोज पर (10) यह सिर्फ मुझे एक Pathऑब्जेक्ट .को चालू कार्यशील डीआईआर के अंदर नामक फ़ाइल की ओर इशारा करता है । "."मेरे लिए काम करने के बजाय एक खाली स्ट्रिंग का उपयोग करना ।
क्रौव

36

मेरे लिए यही उपाय है

File currentDir = new File("");

1
जब आप किसी अन्य फ़ाइल के माता-पिता के रूप में ऐसी फ़ाइल ऑब्जेक्ट का उपयोग करते हैं तो इसके दुष्प्रभाव होते हैं: नई फ़ाइल (नई फ़ाइल (""), "उपदिर") अपेक्षित रूप से काम नहीं करेगी
MRalwasser

13
इसे ठीक करने के लिए, new File("").getAbsoluteFile()इसके बजाय का उपयोग करें ।
MRalwasser

4
इसके लायक क्या है, मेरे पास फ़ाइल ("") के साथ बेहतर भाग्य था।
केशालम

जावा में एक सापेक्ष पथ को परिभाषित करने के लिए कैसे इस पृष्ठ ने मेरी मदद की। इसके अलावा मैंने यह मान लिया था कि मुझे /एक रिश्तेदार मार्ग बनाते समय उपयोग करना चाहिए । मैं गलत था, साथ शुरू मत करो /../डायरेक्टरी ट्री में ऊपर जाने के लिए भी काम करता है।
इर्रेशनलकिला

@keshlam कि मुझे वर्तमान निर्देशिका में एक फ़ाइल कहा जाता है .
Kröw

32

मैंने यह समाधान उन टिप्पणियों में पाया है जो दूसरों की तुलना में बेहतर और अधिक पोर्टेबल हैं:

String cwd = new File("").getAbsolutePath();

या और भी

String cwd = Paths.get("").toAbsolutePath();

यह बिल्कुल गेटगोम के उत्तर के समान है और वास्तव में जावा <7 तरीका है
GoGoris

30

आपको क्या लगता है कि c: \ windows \ system32 आपकी वर्तमान निर्देशिका नहीं है? user.dirसंपत्ति "उपयोगकर्ता की वर्तमान कार्यशील निर्देशिका" होने के लिए स्पष्ट रूप से है।

इसे दूसरे तरीके से रखने के लिए, जब तक आप जावा को कमांड लाइन से शुरू नहीं करते, c: \ windows \ system32 शायद आपका CWD है। यही है, यदि आप अपने प्रोग्राम को शुरू करने के लिए डबल-क्लिक कर रहे हैं, तो CWD निर्देशिका की संभावना नहीं है कि आप डबल क्लिक कर रहे हैं।

संपादित करें : ऐसा प्रतीत होता है कि यह केवल पुरानी खिड़कियों और / या जावा संस्करणों के लिए सच है।


2
यह सच नहीं लगता है, कम से कम जावा 7 user.dirका उपयोग करके मेरी विंडोज 7 मशीन पर नहीं। लगातार फ़ोल्डर है जहां मैंने जार फ़ाइल को डबल-क्लिक किया है।
जोलता

26

उपयोग 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());
    }
}

2
यह JAR फ़ाइल का स्थान देता है। जो मांगा नहीं गया था।
user207421

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

12
जब मैं अपने एप्लिकेशन को JAR फ़ाइल से डबल-क्लिक करके लॉन्च करता हूं, तो एक NPE फेंकता है।
मैथ्यू वाइज

2
""यदि एप्लिकेशन JAR फ़ाइल या CLASSPATH तत्व से चल रहा है तो यह वापस लौटता है । जो मांगा नहीं गया था।
user207421

@ Zizouz212 getClass()एक वस्तु विधि है, इसलिए स्थैतिक संदर्भ में सिर्फ thisकाम नहीं करता है। आपको उस वर्ग का स्पष्ट रूप से उल्लेख करना होगा जो आप कर रहे हैं MyClass.class.getClassLoader().....
क्रॉउन

फिर भी यह काम करने वाली डायरेक्टरी नहीं लौटाएगा ...
एंजेल ओ स्फीयर

18

आम तौर पर, फ़ाइल ऑब्जेक्ट के रूप में:

File getCwd() {
  return new File("").getAbsoluteFile();
}

आप "D: / a / b / c" जैसे पूर्ण योग्य स्ट्रिंग प्राप्त करना चाहते हैं:

getCwd().getAbsolutePath()

1
यह एंड्रॉइड परीक्षणों में अच्छी तरह से काम करता है क्योंकि एंड्रॉइड में java.nio.file.Files शामिल नहीं है।
Iamreptar

मेरे लिए एक स्थिर संदर्भ (नई फ़ाइल ("") NullPointerException फेंकता नहीं लगता है ..?
nsandersen

2
@nsandersen आपने शायद एक गलत फ़ाइल ऑब्जेक्ट का उपयोग किया है: System.out.println (new java.io.File ("")। getAbsolutePath ());
आनेगेटसम


5

पर लिनक्स जब आप एक को चलाने के जार से फ़ाइल टर्मिनल , इन दोनों को एक ही वापस आ जाएगी String: "/ घर / CurrentUser" , कोई फर्क नहीं पड़ता है, जहां आप जार फ़ाइल है। यह सिर्फ इस बात पर निर्भर करता है कि आप अपने टर्मिनल के साथ क्या कर रहे हैं, जब आप जार फाइल शुरू करते हैं।

Paths.get("").toAbsolutePath().toString();

System.getProperty("user.dir");

यदि आपके Classसाथ mainबुलाया जाएगा MainClass, तो कोशिश करें:

MainClass.class.getProtectionDomain().getCodeSource().getLocation().getFile();

यह जार फ़ाइल के पूर्ण पथ के Stringसाथ वापस आ जाएगा ।


3
जो नहीं मांगा गया था।
user207421

5

Windows user.dir का उपयोग करके निर्देशिका को अपेक्षित रूप से लौटाता है, लेकिन जब आप अपने आवेदन को उन्नत अधिकारों (व्यवस्थापक के रूप में चलाते हैं) से शुरू करते हैं, तो उस स्थिति में आपको C: \ WINDOWS \ system32 मिलता है


3

मुझे आशा है कि आप पैकेज सहित वर्तमान निर्देशिका का उपयोग करना चाहते हैं अर्थात यदि आपका जावा प्रोग्राम चालू है c:\myApp\com\foo\src\service\MyTest.javaऔर आप c:\myApp\com\foo\src\serviceतब तक प्रिंट करना चाहते हैं, तो आप निम्नलिखित कोड आज़मा सकते हैं:

String myCurrentDir = System.getProperty("user.dir")
            + File.separator
            + System.getProperty("sun.java.command")
                    .substring(0, System.getProperty("sun.java.command").lastIndexOf("."))
                    .replace(".", File.separator);
    System.out.println(myCurrentDir);

नोट: यह कोड केवल Oracle JRE के साथ विंडोज में परीक्षण किया गया है।


6
यह इस उत्तर को अस्वीकार करने के लिए नहीं किया जाएगा। कृपया पोस्ट करने से पहले अधिक ध्यान से सोचें। आपका कोड टूट गया है, जब तक कि ये सभी सत्य नहीं हैं: 1. जेआरई ओरेकल है, अन्यथा कोई "sun.java.command" सिस्टम संपत्ति नहीं होगी → NPE; 2. ओएस विंडोज है ( File.separatorइसके बजाय, या एक बहु-तर्क Fileनिर्माता का उपयोग करें); 3. क्लासपाथ कमांड लाइन पर विशिष्ट है, और 'पैकेज सहित वर्तमान निर्देशिका' (??) है: a। निर्दिष्ट पहले, बी। निर्दिष्ट बिल्कुल, सी। सीडब्ल्यूडी से बिल्कुल मेल खाता है (यहां तक ​​कि विंडोज के मामले में असंवेदनशीलता के साथ), और डी। CWD का एक वंशज है
माइकल शेपर

यह पता 1 और 2 को संबोधित करता है। लेकिन जब तक मैं कुछ याद नहीं कर रहा हूँ, आप अभी भी कमांड लाइन में निर्दिष्ट किए जा रहे क्लासपाथ पर भरोसा कर रहे हैं (अर्थात एक पर्यावरण चर में नहीं), और 'पैकेज सहित वर्तमान निर्देशिका' के लिए (I स्वीकार करते हैं कि मैं वास्तव में यह नहीं समझता कि आप इसका क्या मतलब है) वर्गपथ में विशेष रूप से पहला तत्व है। और केस मैचिंग की समस्या बनी हुई है। मुझे खेद है अगर मेरी टिप्पणी उपयोगी नहीं थी; मैंने टिप्पणी चरित्र सीमा के भीतर रखने के लिए स्पष्टता का त्याग किया।
माइकल शेपर

@ इन्वर्सस, यह केवल कुछ वातावरण में "पूरी तरह से काम करता है"; आप अभी-अभी भाग्यशाली रहे हैं कि आप इसे अपने आप में परख सकें। लेखन सॉफ्टवेयर जो वैध रनटाइम वातावरण में विफल रहता है, अच्छा अभ्यास नहीं है, तब भी जब परीक्षण वातावरण का आपका सेट उन्हें शामिल करने के लिए पर्याप्त नहीं है।
चार्ल्स डफी

@CharlesDuffy आप सही कह रहे हैं, यह अच्छा अभ्यास नहीं है। सौभाग्य से, यह समाधान "सॉल्व [आईएनजी] मेरा विशिष्ट मुद्दा" वैध रनटाइम वातावरणों में "[विफल] होने का कारण नहीं बना।" वास्तव में, इसने मुझे इस तरह की विफलता को हल करने और अधिक मजबूत कोड लिखने में मदद की, इसके अलावा मेरे पास बहुत ही विशिष्ट मुद्दे को हल करने के लिए (जो केवल इस प्रश्न / उत्तर से कुछ हद तक संबंधित था)। मुझे लगता है कि मैं इसे पाने के लिए भाग्यशाली था।
इन्वर्सस

3

उल्लेख है कि यह केवल में जाँच की है, Windowsलेकिन मुझे लगता है कि यह अन्य ऑपरेटिंग सिस्टम [ Linux,MacOs,Solaris] :) पर सही काम करता है ।


मेरे पास एक ही डायरेक्टरी में 2 .jar फाइलें थीं । मैं एक .jarफ़ाइल से दूसरे को शुरू करना चाहता था.jar फ़ाइल जो उसी निर्देशिका में है।

समस्या यह है कि जब आप इसे cmdचालू निर्देशिका से शुरू करते हैं system32


चेतावनी!

  • नीचे सभी परीक्षण में बहुत अच्छी तरह से काम करने लगता है मैंने फ़ोल्डर नाम के साथ भी किया है ;][[;'57f2g34g87-8+9-09!2#@!$%^^&()या()%&$%^@# यह अच्छी तरह से काम करता है।
  • मैं ProcessBuilderनिम्नलिखित के साथ नीचे का उपयोग कर रहा हूं :

🍂 ..

//The class from which i called this was the class `Main`
String path = getBasePathForClass(Main.class);
String applicationPath=  new File(path + "application.jar").getAbsolutePath();


System.out.println("Directory Path is : "+applicationPath);

//Your know try catch here
//Mention that sometimes it doesn't work for example with folder `;][[;'57f2g34g87-8+9-09!2#@!$%^^&()` 
ProcessBuilder builder = new ProcessBuilder("java", "-jar", applicationPath);
builder.redirectErrorStream(true);
Process process = builder.start();

//...code

🍂 getBasePathForClass(Class<?> classs):

    /**
     * Returns the absolute path of the current directory in which the given
     * class
     * file is.
     * 
     * @param classs
     * @return The absolute path of the current directory in which the class
     *         file is.
     * @author GOXR3PLUS[StackOverFlow user] + bachden [StackOverFlow user]
     */
    public static final String getBasePathForClass(Class<?> classs) {

        // Local variables
        File file;
        String basePath = "";
        boolean failed = false;

        // Let's give a first try
        try {
            file = new File(classs.getProtectionDomain().getCodeSource().getLocation().toURI().getPath());

            if (file.isFile() || file.getPath().endsWith(".jar") || file.getPath().endsWith(".zip")) {
                basePath = file.getParent();
            } else {
                basePath = file.getPath();
            }
        } catch (URISyntaxException ex) {
            failed = true;
            Logger.getLogger(classs.getName()).log(Level.WARNING,
                    "Cannot firgue out base path for class with way (1): ", ex);
        }

        // The above failed?
        if (failed) {
            try {
                file = new File(classs.getClassLoader().getResource("").toURI().getPath());
                basePath = file.getAbsolutePath();

                // the below is for testing purposes...
                // starts with File.separator?
                // String l = local.replaceFirst("[" + File.separator +
                // "/\\\\]", "")
            } catch (URISyntaxException ex) {
                Logger.getLogger(classs.getName()).log(Level.WARNING,
                        "Cannot firgue out base path for class with way (2): ", ex);
            }
        }

        // fix to run inside eclipse
        if (basePath.endsWith(File.separator + "lib") || basePath.endsWith(File.separator + "bin")
                || basePath.endsWith("bin" + File.separator) || basePath.endsWith("lib" + File.separator)) {
            basePath = basePath.substring(0, basePath.length() - 4);
        }
        // fix to run inside netbeans
        if (basePath.endsWith(File.separator + "build" + File.separator + "classes")) {
            basePath = basePath.substring(0, basePath.length() - 14);
        }
        // end fix
        if (!basePath.endsWith(File.separator)) {
            basePath = basePath + File.separator;
        }
        return basePath;
    }

यह JAR फ़ाइल का स्थान देता है। जो मांगा नहीं गया था।
user207421

@EJP .jar फ़ाइल का स्थान जावा प्रोग्राम की वर्तमान कार्यशील निर्देशिका नहीं है?
GOXR3PLUS

2

वर्तमान कार्य निर्देशिका को विभिन्न जावा कार्यान्वयनों में अलग तरह से परिभाषित किया गया है। जावा 7 से पहले के कुछ वर्जन के लिए वर्किंग डायरेक्टरी पाने का कोई सुसंगत तरीका नहीं था। आप इसके साथ जावा फ़ाइल लॉन्च करके -Dऔर जानकारी रखने के लिए एक चर को परिभाषित करके इसके चारों ओर काम कर सकते हैं

कुछ इस तरह

java -D com.mycompany.workingDir="%0"

यह बिल्कुल सही नहीं है, लेकिन आपको यह विचार मिलता है। फिर System.getProperty("com.mycompany.workingDir")...


6
प्रश्न के लिए प्रासंगिक नहीं है।
पीटर डी विंटर

1
इसका जावा के लिए एक अर्थ है - यह डिस्क पर वह स्थान है जहां आपके द्वारा संबंधित पथनामों के साथ खुलने वाली फाइलें संबंधित हैं।
रोब I

2
हां, इसका एक अर्थ है। मेरे शब्द कुछ खराब तरीके से चुने गए थे। लेकिन आप इस बिंदु को याद करते हैं - जावा 7 से पहले वर्तमान कार्य निर्देशिका को जानने का कोई तरीका नहीं था, और अलग-अलग कार्यान्वयन ने उन्हें ... अलग तरीके से ...
MJB

1

मान लें कि आप अपनी परियोजना को ग्रहण के अंदर चलाने की कोशिश कर रहे हैं, या नेटबीएन या कमांड लाइन से अकेले खड़े हैं। मैंने इसे ठीक करने के लिए एक विधि लिखी है

public static final String getBasePathForClass(Class<?> clazz) {
    File file;
    try {
        String basePath = null;
        file = new File(clazz.getProtectionDomain().getCodeSource().getLocation().toURI().getPath());
        if (file.isFile() || file.getPath().endsWith(".jar") || file.getPath().endsWith(".zip")) {
            basePath = file.getParent();
        } else {
            basePath = file.getPath();
        }
        // fix to run inside eclipse
        if (basePath.endsWith(File.separator + "lib") || basePath.endsWith(File.separator + "bin")
                || basePath.endsWith("bin" + File.separator) || basePath.endsWith("lib" + File.separator)) {
            basePath = basePath.substring(0, basePath.length() - 4);
        }
        // fix to run inside netbean
        if (basePath.endsWith(File.separator + "build" + File.separator + "classes")) {
            basePath = basePath.substring(0, basePath.length() - 14);
        }
        // end fix
        if (!basePath.endsWith(File.separator)) {
            basePath = basePath + File.separator;
        }
        return basePath;
    } catch (URISyntaxException e) {
        throw new RuntimeException("Cannot firgue out base path for class: " + clazz.getName());
    }
}

उपयोग करने के लिए, हर जगह जब आप फ़ाइल पढ़ने के लिए आधार पथ प्राप्त करना चाहते हैं, तो आप अपने एंकर वर्ग को उपरोक्त विधि से पास कर सकते हैं, परिणाम वह चीज़ हो सकती है जिसकी आपको आवश्यकता है: D

श्रेष्ठ,


2
यह JAR फ़ाइल का स्थान देता है। जो मांगा नहीं गया था।
user207421

@ user207421 हाँ, मुझे पता है कि यह उत्तर प्रश्न के लिए सही उत्तर नहीं है, लेकिन अधिकांश समय, हर कोई "कमांड लाइन वर्किंग डायरेक्टरी" के बजाय "निर्देशिका जहां जार स्थित है" प्राप्त करना चाहता है।
बछडेन

0

यहां पोस्ट किए गए किसी भी उत्तर ने मेरे लिए काम नहीं किया। यहाँ क्या काम किया है:

java.nio.file.Paths.get(
  getClass().getProtectionDomain().getCodeSource().getLocation().toURI()
);

संपादित करें: मेरे कोड में अंतिम संस्करण:

URL myURL = getClass().getProtectionDomain().getCodeSource().getLocation();
java.net.URI myURI = null;
try {
    myURI = myURL.toURI();
} catch (URISyntaxException e1) 
{}
return java.nio.file.Paths.get(myURI).toFile().toString()

यह JAR फ़ाइल का स्थान देता है। जो मांगा नहीं गया था।
user207421

0

यह मेरी चांदी की गोली है जब कभी भ्रम के क्षणों में बुलबुले उठते हैं। (इसे मुख्य रूप से पहली बात कहें)। हो सकता है कि उदाहरण के लिए JVM को IDE द्वारा अलग-अलग संस्करण के लिए खिसका दिया गया हो। यह स्थिर फ़ंक्शन वर्तमान प्रक्रिया PID को खोजता है और उस pid पर VisualVM खोलता है। भ्रम वहीं रुक जाता है क्योंकि आप यह सब चाहते हैं और आप इसे प्राप्त करते हैं ...

  public static void callJVisualVM() {
    System.out.println("USER:DIR!:" + System.getProperty("user.dir"));
    //next search current jdk/jre
    String jre_root = null;
    String start = "vir";
    try {
        java.lang.management.RuntimeMXBean runtime =
                java.lang.management.ManagementFactory.getRuntimeMXBean();
        String jvmName = runtime.getName();
        System.out.println("JVM Name = " + jvmName);
        long pid = Long.valueOf(jvmName.split("@")[0]);
        System.out.println("JVM PID  = " + pid);
        Runtime thisRun = Runtime.getRuntime();
        jre_root = System.getProperty("java.home");
        System.out.println("jre_root:" + jre_root);
        start = jre_root.concat("\\..\\bin\\jvisualvm.exe " + "--openpid " + pid);
        thisRun.exec(start);
    } catch (Exception e) {
        System.getProperties().list(System.out);
        e.printStackTrace();
    }
}


-7

यह वर्तमान निर्देशिका नाम है

String path="/home/prasad/Desktop/folderName";
File folder = new File(path);
String folderName=folder.getAbsoluteFile().getName();

यह वर्तमान निर्देशिका पथ है

String path=folder.getPath();

1
ओपी चाहता था कि वर्तमान में काम कर रहे डायर जहां से आवेदन चलाया गया था।
लीफ ग्रुएनवोल्ड्ट

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