जावा प्रोजेक्ट में रिश्तेदार पथ से फाइल कैसे पढ़ें? java.io.File निर्दिष्ट पथ नहीं ढूँढ सकता


113

मेरे पास 2 पैकेज के साथ एक परियोजना है:

  1. tkorg.idrs.core.searchengines
  2. tkorg.idrs.core.searchengines

पैकेज में (2) मेरे पास एक पाठ फ़ाइल है ListStopWords.txt, पैकेज में (1) मेरे पास एक वर्ग है FileLoadder। यहाँ कोड है FileLoader:

File file = new File("properties\\files\\ListStopWords.txt");

लेकिन क्या यह त्रुटि है:

The system cannot find the path specified

क्या आप इसे ठीक करने के लिए कोई समाधान दे सकते हैं? धन्यवाद।


12
आपके दोनों पैकेज उदाहरण समान हैं। तुम्हारा मतलब नहीं है properties.filesके लिए 2?
बालूसी

जवाबों:


173

यदि यह पहले से ही क्लासपाथ में है, तो बस इसे डिस्क फ़ाइल सिस्टम के बजाय क्लासपाथ से प्राप्त करें। में रिश्तेदार पथ के साथ बेला मत करो java.io.File। वे वर्तमान कामकाजी निर्देशिका पर निर्भर हैं, जिस पर आपके पास जावा कोड के अंदर से पूरी तरह से कोई नियंत्रण नहीं है।

मान लें कि ListStopWords.txtआपकी FileLoaderकक्षा के समान पैकेज में है , तब करें:

URL url = getClass().getResource("ListStopWords.txt");
File file = new File(url.getPath());

या यदि आप आखिरकार हैं तो वास्तव InputStreamमें इसका एक हिस्सा है:

InputStream input = getClass().getResourceAsStream("ListStopWords.txt");

यह निश्चित रूप से बनाने पर पसंद किया जाता है new File()क्योंकि urlयह आवश्यक रूप से डिस्क फ़ाइल सिस्टम पथ का प्रतिनिधित्व नहीं कर सकता है, लेकिन यह वर्चुअल फ़ाइल सिस्टम पथ का प्रतिनिधित्व भी कर सकता है (जो तब हो सकता है जब डिस्क फ़ाइल सिस्टम पर एक अस्थायी फ़ोल्डर में JAR को मेमोरी में विस्तारित किया जाता है) या यहां तक ​​कि एक नेटवर्क पथ जो दोनों प्रति रचनाकार द्वारा पचने योग्य नहीं हैं File

यदि फ़ाइल -as पैकेज नाम संकेत है- वास्तव में एक "पूर्ण" एक्सटेंशन के साथ एक पूर्ण गुण वाली फ़ाइल ( key=valueलाइनें युक्त ) है, तो आप InputStreamतुरंत load()विधि को खिला सकते हैं ।

Properties properties = new Properties();
properties.load(getClass().getResourceAsStream("ListStopWords.txt"));

नोट: जब आप इसे अंदर के staticसंदर्भ से एक्सेस करने का प्रयास कर रहे हों , तो उपरोक्त उदाहरणों के बजाय FileLoader.class(या जो भी YourClass.class) उपयोग करें getClass()


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

2
ओह, यह ClassLoader.class होना चाहिए।
टर्बो

4
@turbo: FileLoaderओपी का अपना कस्टम वर्ग है। यह ठीक उसी वर्ग का माना जाता है जिसमें आप संसाधन प्राप्त करने का प्रयास कर रहे हैं। इस प्रकार, ऐसा NameOfYourCurrentClass.class.getResourceAsStream(...)ClassLoader.classयदि असफल हो जायेगी ClassLoaderवर्ग एक अलग classloader, जो कई classloaders के एक पदानुक्रम (एक जावा EE वेब अनुप्रयोग की तरह) के साथ एक "उद्यम" आवेदन में हो सकता है द्वारा लोड किया जा रहा है।
बालूसी

ओह अछा। मुझे समझ नहीं आया कि यह निर्भर था। इसे साफ करने के लिए धन्यवाद!
टर्बो

10
किसी भी सुझाव के लिए अगर फ़ाइल एक ही पैकेज में नहीं है? मेरे उदाहरण में, मैं एक फ़ाइल खोलने की कोशिश कर रहा हूं, जो एक परीक्षण पैकेज में स्थित है।
रॉबिन न्यूहाउस

44

यदि हम फ़ाइल के सापेक्ष पथ को निर्दिष्ट करना चाहते हैं, तो निम्न पंक्ति का उपयोग किया जा सकता है।

File file = new File("./properties/files/ListStopWords.txt");  

3
क्या मुझे पता है कि रास्ते के बीच 3 स्लैश क्यों हो सकते हैं।
8

त्रुटि:> स्ट्रिंग शाब्दिक में अवैध एस्केप चरित्र।
इगोरगानापोलस्की

इसको a में कैसे बदलें InputStream?
इगोरगानापल्स्की

1
@IgorGanapolskyInputStream is = new FileInputStream("./properties/files/ListStopWords.txt");
कैमरून हडसन

42

सापेक्ष पथ जावा में काम करता है। ऑपरेटर।

  • । वर्तमान में चल रहे संदर्भ के समान फ़ोल्डर का अर्थ है।
  • .. का अर्थ है वर्तमान में चल रहे संदर्भ के मूल फ़ोल्डर।

तो सवाल यह है कि आप उस मार्ग को कैसे जानते हैं जहां जावा वर्तमान में देख रहा है?

एक छोटा सा प्रयोग करो

   File directory = new File("./");
   System.out.println(directory.getAbsolutePath());

आउटपुट का निरीक्षण करें, आपको वर्तमान निर्देशिका का पता चल जाएगा जहां जावा दिख रही है। वहां से, बस अपनी फ़ाइल का पता लगाने के लिए ./ ऑपरेटर का उपयोग करें।

उदाहरण के लिए यदि आउटपुट है

जी: \ JAVA8Ws \ MyProject \ सामग्री।

और आपकी फ़ाइल फ़ोल्डर में मौजूद है MyProject बस उपयोग करें

File resourceFile = new File("../myFile.txt");

उम्मीद है की यह मदद करेगा


इस उत्तर की खोज के घंटों के बाद मुझे समाधान के साथ प्रदान किया गया
erdostamasa

8
InputStream in = FileLoader.class.getResourceAsStream("<relative path from this class to the file to be read>");
try {
    BufferedReader reader = new BufferedReader(new InputStreamReader(in));
    String line = null;
        while ((line = reader.readLine()) != null) {
            System.out.println(line);
        }
} catch (Exception e) {
    e.printStackTrace();
}

1
@IgorGanapolsky वर्ग का नाम। आप .classअपनी कक्षा का पूरा नाम प्रदान करके केवल शाब्दिक का उल्लेख कर सकते हैं ।
टॉमाज़ मूलार्क

मुझे लगता है कि यह FileLoader होने का इरादा है।
jamesdeath123


5

मैं टिप्पणी कर सकता था लेकिन मेरे पास इसके लिए कम प्रतिनिधि हैं। सम्राट के जवाब ने मेरे लिए काम किया। निम्नलिखित कोड के माध्यम से वर्तमान निर्देशिका पथ को देखना बेहतर है।

    File directory = new File("./");
    System.out.println(directory.getAbsolutePath());

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

    ./test/conf/appProperties/keystore 

मैं अपना कोड tomcat के माध्यम से चला रहा हूं और इसलिए वर्तमान निर्देशिका प्रोजेक्ट फ़ोल्डर नहीं है - मैं प्रोजेक्ट रूट के सापेक्ष पथ को कैसे परिभाषित करूं? Im वर्तमान में कठिन पथ का उपयोग कर रहा है: "C: \\ उपयोक्ता \\ उपयोक्ता \\ डेस्कटॉप \\ रिपोजिटरीज \\ L1_WebShop \\ dblogs.log";
टियागो रेडेल्ली

@TiagoRedaelli इस प्रश्न को देखें: stackoverflow.com/questions/12843217/…
dezible

4

जबकि BalusC द्वारा प्रदान किया गया उत्तर इस मामले के लिए काम करता है, यह तब टूटेगा जब फ़ाइल पथ में रिक्त स्थान होता है क्योंकि URL में, इन्हें% 20 में परिवर्तित किया जा रहा है जो कि मान्य फ़ाइल नाम नहीं है। यदि आप स्ट्रिंग के बजाय URI का उपयोग करके फ़ाइल ऑब्जेक्ट का निर्माण करते हैं, तो व्हाट्सएप को सही तरीके से संभाला जाएगा:

URL url = getClass().getResource("ListStopWords.txt");
File file = new File(url.toURI());

2

मैं src / main // js / Simulator.java के अंदर 'command.json' को पार्स करना चाहता था। उसके लिए मैंने src फोल्डर में json फाइल कॉपी की और इस तरह पूर्ण पथ दिया:

Object obj  = parser.parse(new FileReader("./src/command.json"));

2

यहां छवि विवरण दर्ज करें

मान लें कि आप कक्षा resourcesमें निर्देशिका से पढ़ना चाहते हैं FileSystem

String file = "dummy.txt";
var path = Paths.get("src/com/company/fs/resources/", file);
System.out.println(path);

System.out.println(Files.readString(path));

नोट: अग्रणी .की जरूरत नहीं है।


1

मेरे लिए वास्तव में समस्या फ़ाइल ऑब्जेक्ट के क्लास पथ से है <project folder path> or ./src, इसलिए File file = new File("./src/xxx.txt");मेरी समस्या का समाधान करें


0

स्ट्रिंग आधारपाठ = नई फ़ाइल ("myFile.txt")। GetAbsolutePath (); इस बेसपे को आप अपनी फ़ाइल के सही पथ के रूप में उपयोग कर सकते हैं


-1

यदि आप getClass()स्टैटिक विधि या स्थिर ब्लॉक से कॉल करने का प्रयास कर रहे हैं, तो आप निम्न तरीके से कर सकते हैं।

आप getClass()उस Propertiesवस्तु पर कॉल कर सकते हैं जिसे आप लोड कर रहे हैं।

public static Properties pathProperties = null;

static { 
    pathProperties = new Properties();
    String pathPropertiesFile = "/file.xml;
    InputStream paths = pathProperties.getClass().getResourceAsStream(pathPropertiesFile);
}

बस एक बंद बोली याद आ रही है।
jamesdeath123

-1

यदि पाठ फ़ाइल नहीं पढ़ी जा रही है, तो अधिक निकट निरपेक्ष पथ का उपयोग करने का प्रयास करें (यदि आप चाहें तो आप पूर्ण निरपेक्ष पथ का उपयोग कर सकते हैं):

FileInputStream fin=new FileInputStream("\\Dash\\src\\RS\\Test.txt");

यह मान लेना कि पूर्ण मार्ग है:

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