2010-04-19 16 views
11

मैं फ़ाइल सामग्री में पढ़ने के लिए कोशिश कर रहा हूँ, उदाहरण के लिए:एक classpath में फ़ाइल को ढूंढने में

public void myMethod(){ 
    FileInputStream fstream = new FileInputStream(fileLocation); 
    BufferedReader br = new BufferedReader(new InputStreamReader(fstream)); 
    String strLine; 
    while ((strLine = br.readLine()) != null) { 
.... 
.... 
..... 
end while 
end method 

और मैं वर्ग शरीर private String fileLocation; की शुरुआत में और एक वर्ग के अंत में है मैं एक गेटर है और इसके लिए सेटटर। अब मैं इस कक्षा से वसंत से वसंत से इस फ़ाइल स्थान को इंजेक्ट करने की कोशिश कर रहा हूं और मैं इस वर्ग की init-method निर्दिष्ट करता हूं। लेकिन मुझे त्रुटि मिलती है कि निर्दिष्ट फ़ाइल नहीं मिलती है जैसे कि यह क्लासपाथ पर नहीं है लेकिन यह युद्ध फ़ाइल के अंदर है?

Error: src\main\resources\ids.txt (The system cannot find the path specified)

है यही कारण है कि जब मैं इस की कोशिश की:

FileInputStream fstream = new FileInputStream("src\\main\\resources\\ids.txt"); 

कैसे संदर्भ के लिए मैं Maven के साथ इस परियोजना के निर्माण कर रहा हूँ और मैं src/main/resources इस में फ़ाइल डाल त्रुटि मैं जब फ़ाइल पढ़ने का प्रयास मिलता है वर्गपाथ से ठीक से?

संपादित

जब मैं @BalusC समाधान के अनुसार मेरी कोड को संपादित यहां उसे लग रहा है लेकिन मैं अभी भी null त्रुटि मिलती है:

ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); 
    InputStream input = classLoader.getResourceAsStream("src/main/resources/ids.txt"); 
    BufferedReader br = new BufferedReader(new InputStreamReader(input)); 
    String strLine; 
while ((strLine = br.readLine()) != null) { 
    .... 
    .... 
    ..... 
    end while 
    end method 

उत्तर

22

जावा आईओ एपीआई स्थानीय डिस्क पर निर्भर करता है फ़ाइल सिस्टम, क्लासपाथ पर नहीं। इसके अलावा, जावा आईओ सामान में सापेक्ष पथ का उपयोग पोर्टेबिलिटी मुसीबत के लिए नुस्खा है, इस पर भरोसा न करें। कक्षापथ में संसाधन आवंटित करने के लिए आप आमतौर पर ClassLoader#getResource() या ClassLoader#getResourceAsStream() का उपयोग करेंगे।

ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); 
InputStream input = classLoader.getResourceAsStream("src/main/resources/ids.txt"); 

कहा यही कारण है, आपको लगता है कि DataInputStream लाइन की जरूरत नहीं है। आप वास्तव में इससे कोई लाभ नहीं ले रहे हैं।

अद्यतन: यदि यह काम नहीं करता है, तो या तो संसाधन का नाम केवल अमान्य है या फ़ाइल वास्तव में क्लासपाथ में नहीं है जहां आप उम्मीद करते हैं। कि src फ़ोल्डर पर मेरे सेंट वास्तव में एक पैकेज के जड़ classpath की और नहीं हिस्सा है। इसे नाम से हटा दें।

अद्यतन 2: प्राप्त करने के लिए सभी जड़ डिस्क फाइल सिस्टम पथ जो क्रम classpath द्वारा कवर किया जाता है:

for (URL root : Collections.list(Thread.currentThread().getContextClassLoader().getResources(""))) { 
    System.out.println(root); 
} 

संसाधन नाम उनमें से या तो के सापेक्ष की जरूरत है। निर्माण के दौरान /WEB-INF/classes में रखा गया है यह सामान्य है। यह कक्षापथ द्वारा कवर किया गया है। आपकी समस्या कहीं और है। क्या आप सुनिश्चित हैं कि संसाधन का नाम सही है? क्या आप वाकई कोड चला रहे हैं जो आपको लगता है कि आप चल रहे हैं?

+0

@ बालससी आपके उत्तर के लिए धन्यवाद, मैंने अपना प्रश्न अपडेट किया है –

+0

मैंने पहले ही अपना जवाब अपडेट करने के लिए अपडेट किया है :) – BalusC

+1

@ बालुससी वही है जब मैं 'src' bit को हटाता हूं, मैंने अभी लक्ष्य युद्ध के अंदर देखा है जो इस फाइल के अंदर jboss पर तैनात किया जाता है ग्रहण में 'वेब-INF/classes' अंदर लेकिन मेरी परियोजना में स्थान है इसके' src/मुख्य/किसी अन्य चाल ऊपर resources' अपने आस्तीन में स्थित? –

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