2010-07-22 17 views
8

मैं तर्क के माध्यम से एक पाठ फ़ाइल पढ़ने के लिए एक प्रोग्राम लिखने की कोशिश कर रहा हूं, लेकिन जब मैं इसे चलाता हूं, तो यह हमेशा कहता है कि फ़ाइल नहीं मिल सकती है, भले ही मैंने इसे उसी फ़ोल्डर में रखा जो मुख्य.जावा है जो चल रहा है। क्या कोई मेरी समस्या का समाधान या टेक्स्ट फ़ाइल पढ़ने का बेहतर तरीका जानता है?एक तर्क फ़ाइल को तर्क के रूप में कैसे पास किया जाए?

+0

मुझे लगता है कि यदि प्रोग्राम प्रोग्राम के रूप में इनपुट पास किया जा रहा है, तो आप प्रोग्राम में मनमाने ढंग से इनपुट पास करना चाहते हैं। क्या वो सही है? –

+0

उम्म वास्तव में नहीं। क्या आप विधियों या कार्यों के बारे में बात कर रहे हैं? मैं तर्क में गुजरने वाले वर्ग के रूप में बात कर रहा हूं और जब मैं मुख्य विधि चलाता हूं तो उसे टेक्स्ट फ़ाइल पढ़नी चाहिए लेकिन ऐसा नहीं है। मेरा कोड स्कैनर sc1 = नया स्कैनर है (नई फ़ाइल (तर्क [0])); जब इसे डिबगिंग किया जाता है तो यह लाइन भी पास नहीं हो सका। – Victor

उत्तर

8

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"); 
    // ... 
} 
+0

आप ग्रहण में कार्यशील निर्देशिका निर्दिष्ट कर सकते हैं। यह "रन के रूप में" के तहत संवाद में है। यह सापेक्ष पथों का उपयोग करने का एक तरीका है और अभी भी ग्रहण के अंदर उचित व्यवहार प्राप्त करता है। –

+0

सच है, हमेशा कामकाज और बतख होंगे, लेकिन आप वास्तव में अपने आवेदन को स्थायी रूप से निर्भर नहीं करना चाहते हैं जब बहुत बेहतर तरीके हों। – BalusC

1

फ़ाइल नाम के लिए एक पूर्ण पथ देने का प्रयास करें।

इसके अलावा, कोड पोस्ट करें ताकि हम देख सकें कि आप वास्तव में क्या प्रयास कर रहे हैं।

+0

यह इस लाइन को पारित नहीं कर सकता: स्कैनर sc1 = नया स्कैनर (नई फ़ाइल (तर्क [0])); और मैंने अपनी टेक्स्ट फ़ाइल को पहले तर्क – Victor

+0

के रूप में पारित किया है, संयोजन रेखाएं कोड को छोटा करने और संभवतः प्रदर्शन (गति) में सुधार करने में मदद कर सकती हैं, लेकिन जब डिबगिंग होती है, तो यह चीजों को विभाजित करने में मदद करती है (यानी, रचनाकारों के भीतर कन्स्ट्रक्टर एम्बेड नहीं)। फ़ाइल ऑब्जेक्ट बनाएं, देखें कि यह वह स्थान है जहां प्रोग्राम यात्रा करता है। यदि नहीं, तो फ़ाइल ऑब्जेक्ट को स्कैनर (एक अलग पंक्ति में) पास करें और देखें कि किस प्रकार की त्रुटि फेंक दी गई है। – chimeracoder

0

यदि आप ग्रहण (या एक समान आईडीई) का उपयोग कर रहे हैं, तो समस्या इस तथ्य से उत्पन्न होती है कि आपका प्रोग्राम उपरोक्त कुछ निर्देशिकाओं से चलाया जाता है जहां वास्तविक स्रोत स्थित है। प्रोजेक्ट ट्री में अपनी फ़ाइल को एक या दो स्तर ऊपर ले जाने का प्रयास करें।

अधिक जानकारी के लिए this question देखें।

0

आप फ़ाइल और वर्ग एक ही पैकेज के तहत यह काम करने के साथ आप इस का उपयोग कर सकते डाल दिया:

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 के बारे में पढ़ा यह मदद मिलेगी।

0

जब आप जावा में एक सापेक्ष फ़ाइल नाम के साथ फ़ाइल खोल रहे हैं (और सामान्य रूप से) यह कार्यशील निर्देशिका से संबंधित खुलता है।

आप अपनी प्रक्रिया

String workindDir = new File(".").getAbsoultePath() 

का उपयोग कर सुनिश्चित करें कि आप सही निर्देशिका से अपने कार्यक्रम चला रहे हैं की वर्तमान कार्यशील निर्देशिका पा सकते हैं (या फ़ाइल नाम बदलें कि वह तुम कहाँ चल रहे हैं के सापेक्ष हो जाएगा यह से)।

+0

वर्तमान कार्य निर्देशिका भी सिस्टम प्रॉपर्टी "user.dir" के माध्यम से उपलब्ध है। –

0

सरल समाधान के लिए एक नया फ़ाइल बनाने के लिए है, तो देखें कि आउटपुट फ़ाइल है। आपकी इनपुट फ़ाइल को रखने के लिए यह सही जगह है।

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