मैं निम्नलिखित कोड का उपयोग कर जावा में एक वाईएएमएल फ़ाइल पढ़ने की कोशिश कर रहा हूं:

public class LoadFile {
  public static void main(String[] args) throws IOException {             
      Yaml yaml = new Yaml();
      InputStream inputStream = LoadFile.class
       .getClassLoader()
       .getResourceAsStream("ABSOLUTE PATH TO YAML");
      Object obj = yaml.load(inputStream);
      System.out.println(obj);    
  }
  }

लेकिन मुझे यह अपवाद मिलता है जो मुझे समझ में नहीं आता कि ऐसा क्यों होता है।

थ्रेड में अपवाद "मुख्य" org.yaml.snakeyaml.error.YAMLException: java.io.IOException: स्ट्रीम बंद

1
Sou 27 मई 2020, 00:39
क्या getResourceAsStream एक स्ट्रीम या शून्य देता है?
 – 
eg04lt3r
27 मई 2020, 00:59

2 जवाब

यह स्पष्ट नहीं है कि समस्या का कारण क्या है लेकिन जांच करने के लिए कुछ चीजें हैं: 1- सुनिश्चित करें कि पथ सही है 2- सुनिश्चित करें कि फ़ाइल प्रारूप सही है

साइड नोट: बेहतर कास्टिंग के लिए आप ऑब्जेक्ट को Map<String,Object> में बदल सकते हैं

0
hesham osman 27 मई 2020, 01:22

आप एक ही स्ट्रीम को दो बार पढ़ रहे हैं। स्ट्रीम JavaDocs से

एक स्ट्रीम को केवल एक बार (एक मध्यवर्ती या टर्मिनल स्ट्रीम ऑपरेशन को लागू करते हुए) संचालित किया जाना चाहिए।

यहां

InputStream inputStream = LoadFile.class
       .getClassLoader()
       .getResourceAsStream("ABSOLUTE PATH TO YAML");

और यहाँ

Object obj = yaml.load(inputStream);

समस्या यह है कि inputStream का पहले ही उपभोग किया जा चुका है, इसलिए yaml.load() पर कॉल विफल होनी चाहिए और यहीं पर java.io.IOException: Stream closed अपवाद फेंका जा रहा है।

समाधान: या तो अपनी स्ट्रीम की एक कॉपी बनाएं या एक बार पहले ही खपत (पढ़ें) के बाद दूसरी बार इसका सेवन न करें।

0
nabster 27 मई 2020, 01:50
क्या आप कोशिश कर सकते हैं yaml.load(LoadFile.class .getClassLoader() .getResourceAsStream("ABSOLUTE PATH TO YAML");
 – 
nabster
27 मई 2020, 01:38
साथ ही, मैं आपके कोड को try/catch ब्लॉक में लपेटूंगा और IOException अपवाद को विधि कॉल स्टैक को पास करने के बजाय संभालूंगा :)
 – 
nabster
27 मई 2020, 01:44