मैं तर्क के माध्यम से एक पाठ फ़ाइल पढ़ने के लिए एक प्रोग्राम लिखने की कोशिश कर रहा हूं, लेकिन जब मैं इसे चलाता हूं, तो यह हमेशा कहता है कि फ़ाइल नहीं मिल सकती है, भले ही मैंने इसे उसी फ़ोल्डर में रखा जो मुख्य.जावा है जो चल रहा है। क्या कोई मेरी समस्या का समाधान या टेक्स्ट फ़ाइल पढ़ने का बेहतर तरीका जानता है?एक तर्क फ़ाइल को तर्क के रूप में कैसे पास किया जाए?
उत्तर
java.io.File
में सापेक्ष पथ का उपयोग न करें।
यह वर्तमान कार्यशील निर्देशिका के सापेक्ष बन जाएगा जो इस तरह से निर्भर करता है कि आप एप्लिकेशन को कैसे चलाते हैं जो बदले में आपके आवेदन के अंदर से नियंत्रित नहीं है। यह केवल पोर्टेबिलिटी परेशानी का कारण बन जाएगा। यदि आप इसे ग्रहण के अंदर से चलाते हैं, तो पथ /path/to/eclipse/workspace/projectname
के सापेक्ष होगा। यदि आप इसे अंदर कमांड कंसोल से चलाते हैं, तो यह के सापेक्ष खोला गया फ़ोल्डर के सापेक्ष होगा (भले ही आप पूर्ण पथ से कोड चलाएं!)। यदि आप इसे JAR को डबलक्लिक करके चलाते हैं, तो यह JAR के मूल फ़ोल्डर से संबंधित होगा। यदि आप इसे वेबसर्वर में चलाते हैं, तो यह /path/to/webserver/binaries
के सापेक्ष होगा। आदि।
हमेशा java.io.File
में पूर्ण पथ का उपयोग करें, कोई बहाना नहीं।
पूर्ण पोर्टेबिलिटी और पूर्ण पथ के साथ कम सिरदर्द के लिए, बस रनटाइम क्लासपाथ (या रनटाइम क्लासपाथ में अपना पथ जोड़ें) द्वारा कवर किए गए पथ में फ़ाइल रखें। इस तरह आप Class#getResource()
या इसकी सामग्री Class#getResourceAsStream()
द्वारा फ़ाइल प्राप्त कर सकते हैं। यदि यह आपके वर्तमान वर्ग के समान फ़ोल्डर (पैकेज) में है, तो यह पहले से ही कक्षापथ में है। इसे उपयोग करने के लिए, बस करो:
public MyClass() {
URL url = getClass().getResource("filename.txt");
File file = new File(url.getPath());
InputStream input = new FileInputStream(file);
// ...
}
या
public MyClass() {
InputStream input = getClass().getResourceAsStream("filename.txt");
// ...
}
आप ग्रहण में कार्यशील निर्देशिका निर्दिष्ट कर सकते हैं। यह "रन के रूप में" के तहत संवाद में है। यह सापेक्ष पथों का उपयोग करने का एक तरीका है और अभी भी ग्रहण के अंदर उचित व्यवहार प्राप्त करता है। –
सच है, हमेशा कामकाज और बतख होंगे, लेकिन आप वास्तव में अपने आवेदन को स्थायी रूप से निर्भर नहीं करना चाहते हैं जब बहुत बेहतर तरीके हों। – BalusC
फ़ाइल नाम के लिए एक पूर्ण पथ देने का प्रयास करें।
इसके अलावा, कोड पोस्ट करें ताकि हम देख सकें कि आप वास्तव में क्या प्रयास कर रहे हैं।
यह इस लाइन को पारित नहीं कर सकता: स्कैनर sc1 = नया स्कैनर (नई फ़ाइल (तर्क [0])); और मैंने अपनी टेक्स्ट फ़ाइल को पहले तर्क – Victor
के रूप में पारित किया है, संयोजन रेखाएं कोड को छोटा करने और संभवतः प्रदर्शन (गति) में सुधार करने में मदद कर सकती हैं, लेकिन जब डिबगिंग होती है, तो यह चीजों को विभाजित करने में मदद करती है (यानी, रचनाकारों के भीतर कन्स्ट्रक्टर एम्बेड नहीं)। फ़ाइल ऑब्जेक्ट बनाएं, देखें कि यह वह स्थान है जहां प्रोग्राम यात्रा करता है। यदि नहीं, तो फ़ाइल ऑब्जेक्ट को स्कैनर (एक अलग पंक्ति में) पास करें और देखें कि किस प्रकार की त्रुटि फेंक दी गई है। – chimeracoder
यदि आप ग्रहण (या एक समान आईडीई) का उपयोग कर रहे हैं, तो समस्या इस तथ्य से उत्पन्न होती है कि आपका प्रोग्राम उपरोक्त कुछ निर्देशिकाओं से चलाया जाता है जहां वास्तविक स्रोत स्थित है। प्रोजेक्ट ट्री में अपनी फ़ाइल को एक या दो स्तर ऊपर ले जाने का प्रयास करें।
अधिक जानकारी के लिए this question देखें।
आप फ़ाइल और वर्ग एक ही पैकेज के तहत यह काम करने के साथ आप इस का उपयोग कर सकते डाल दिया:
Class A {
void readFile (String fileName) {
Url tmp = A.class.getResource (fileName);
// Or Url tmp = this.getClass().getResource (fileName);
File tmpFile = File (tmp);
if (tmpFile.exists())
System.out.print("I found the file.")
}
}
अगर आप classloaders के बारे में पढ़ा यह मदद मिलेगी।
जब आप जावा में एक सापेक्ष फ़ाइल नाम के साथ फ़ाइल खोल रहे हैं (और सामान्य रूप से) यह कार्यशील निर्देशिका से संबंधित खुलता है।
आप अपनी प्रक्रिया
String workindDir = new File(".").getAbsoultePath()
का उपयोग कर सुनिश्चित करें कि आप सही निर्देशिका से अपने कार्यक्रम चला रहे हैं की वर्तमान कार्यशील निर्देशिका पा सकते हैं (या फ़ाइल नाम बदलें कि वह तुम कहाँ चल रहे हैं के सापेक्ष हो जाएगा यह से)।
वर्तमान कार्य निर्देशिका भी सिस्टम प्रॉपर्टी "user.dir" के माध्यम से उपलब्ध है। –
सरल समाधान के लिए एक नया फ़ाइल बनाने के लिए है, तो देखें कि आउटपुट फ़ाइल है। आपकी इनपुट फ़ाइल को रखने के लिए यह सही जगह है।
- 1. अच्छा डिज़ाइन: इनपुटस्ट्रीम को तर्क के रूप में कैसे पास किया जाए?
- 2. कॉफ़ीस्क्रिप्ट में तर्क के रूप में दो अज्ञात कार्यों को कैसे पास किया जाए?
- 3. एसओएल कंटेनरों को BOOST_CHECK_EQUAL के तर्क के रूप में कैसे पास किया जाए?
- 4. सदस्य फ़ंक्शन को पायथन में तर्क के रूप में कैसे पास किया जाए?
- 5. पास चार सरणी को तर्क के रूप में पास करें
- 6. ऑपरेटरों को पैरामीटर के रूप में कैसे पास किया जाए
- 7. पास तर्क __enter__ को
- 8. सी में कमांड लाइन तर्क में एक शून्य वर्ण में कैसे पास किया जाए?
- 9. $ (यह) तर्क के रूप में पास?
- 10. एक ट्यूपल तर्क को सबसे अच्छा तरीका कैसे पास किया जाए?
- 11. PHP: गुमनाम कार्य को तर्क के रूप में पास करें
- 12. सी ++ और ओपनजीएल में किसी अन्य फ़ंक्शन के लिए तर्क के रूप में क्लास विधि को कैसे पास किया जाए?
- 13. MySQL में: संग्रहित प्रक्रिया और/या फ़ंक्शन तर्क के रूप में तालिका नाम को कैसे पास किया जाए?
- 14. लुआ प्रोग्राम में तर्क कैसे पास और पढ़ा जाए?
- 15. तर्क में उपयोग किया गया तर्क ArrayList
- 16. एक तर्क के रूप में फंक्शन पॉइंटर
- 17. बैश स्क्रिप्ट से बैच फ़ाइल में किसी तर्क में पाइप वर्ण को कैसे शामिल किया जाए?
- 18. एक शब्दकोष के रूप में पाइथन तर्क
- 19. पास मैट्रिक्स तर्क
- 20. एक पैरामीटर श्रेणी को एक तर्क के रूप में कैसे पास करें
- 21. एनएसएक्शन के लिए तर्क कैसे पास करें?
- 22. कोको में ऑब्जेक्ट फैक्ट्री के लिए एक क्लास नाम को तर्क के रूप में कैसे पास किया जा सकता है?
- 23. एक चर को एक खंड में कैसे पास किया जाए?
- 24. कैसे एक समारोह तर्क के रूप में एक विधेय
- 25. लिनक्स खोल: फ़ाइल से कमांड तर्क कैसे पढ़ा जाए?
- 26. एक पूरी फ़ाइल को JVM तर्क
- 27. एक एन्यूम प्रकार को एक तर्क के रूप में पास करना?
- 28. तर्क के रूप में एक सूची के साथ defun
- 29. पास वर्ण तर्क और मूल्यांकन
- 30. सभी तर्कों को किसी अन्य फ़ंक्शन में संग्रह के रूप में कैसे पास किया जाए, न कि एकल तर्क के रूप में?
मुझे लगता है कि यदि प्रोग्राम प्रोग्राम के रूप में इनपुट पास किया जा रहा है, तो आप प्रोग्राम में मनमाने ढंग से इनपुट पास करना चाहते हैं। क्या वो सही है? –
उम्म वास्तव में नहीं। क्या आप विधियों या कार्यों के बारे में बात कर रहे हैं? मैं तर्क में गुजरने वाले वर्ग के रूप में बात कर रहा हूं और जब मैं मुख्य विधि चलाता हूं तो उसे टेक्स्ट फ़ाइल पढ़नी चाहिए लेकिन ऐसा नहीं है। मेरा कोड स्कैनर sc1 = नया स्कैनर है (नई फ़ाइल (तर्क [0])); जब इसे डिबगिंग किया जाता है तो यह लाइन भी पास नहीं हो सका। – Victor