2013-02-27 179 views
7

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

// working 
BufferedReader reader = new BufferedReader(new InputStreamReader(
Test.class.getResourceAsStream("conf/fp.properties"))); 

// not working 
val reader = new BufferedReader(new InputStreamReader(
getClass.getResourceAsStream("conf/fp.properties"))); 

Exception in thread "main" java.lang.NullPointerException 
at java.io.Reader.<init>(Reader.java:78) 
at java.io.InputStreamReader.<init>(InputStreamReader.java:72) 
at com.ebay.searchscience.searchmetrics.fp.conf.FPConf$.main(FPConf.scala:31) 
at com.ebay.searchscience.searchmetrics.fp.conf.FPConf.main(FPConf.scala) 
+0

आप [Config] (https://github.com/typesafehub/config) का उपयोग क्यों नहीं करते? –

+3

समाधान मिला, मुझे "/conf/fp.properties" पर पूर्ण पथ का उपयोग करना चाहिए, लेकिन अभी भी स्पष्ट नहीं है कि सापेक्ष पथ जावा में क्यों काम करता है लेकिन स्कैला में नहीं – zjffdu

उत्तर

6

मैं अनुमान लगा रहा हूँ कि अपने BufferedReader एक java.io.BufferedReader

उस मामले तो आप बस निम्नलिखित कर सकता है में है:

import scala.io.Source.fromUrl 
val reader = fromURL(getClass.getResource("conf/fp.properties")).bufferedReader() 

हालांकि, इस सवाल का रूप खुला छोड़ देता है कि तुम क्या योजना बना रहे हैं बाद में reader के साथ करने के लिए। scala.io.Source पहले से ही, कुछ उपयोगी तरीकों कि अपने कोड ज़रूरत से ज़्यादा के बहुत सारे बना सकता है .. see ScalaDoc

+0

क्या होगा अगर संपत्ति फ़ाइल जार फ़ाइल के अंदर रहती है (उदाहरण के लिए संसाधनों में)? –

+0

[से] (http://stackoverflow.com/questions/5285898/how-to-get-a-resource-within-scalatest-w-sbt): 'val source = Source.fromURL (getClass.getResource ("/conf/fp.properties ")) – suls

+0

यह तरीका बेहतर तरीका है –

2

एक गुण फ़ाइल को पढ़ने के लिए मैं java.util.ResourceBundle.getBundle("conf/fp") उपयोग करने के लिए सलाह देते हैं है यह जीवन को थोड़ा आसान बना देता है।

0

आपके द्वारा देखे जा रहे NullPointerException अंतर्निहित जावा कोड में एक बग के कारण होता है। यह एक गलत टाइप किए गए फ़ाइल नाम के कारण हो सकता है।

कभी-कभी आपको यह त्रुटि भी मिलती है यदि आप गलत क्लासलोडर के साथ संसाधन लोड करने का प्रयास कर रहे हैं।

  1. अपने क्लासपाथ के विरुद्ध संसाधन यूआरएल सावधानी से जांचें।
  2. Source.fromInputStream(getClass.getResourceAsStream(...))
  3. शायद तुम अन्य classloaders तुम कोशिश कर सकते उपयोग कर रहे हैं की कोशिश करो कोशिश करो Source.fromInputStream(getClass.getClassLoader.getResourceAsStream())
  4. ?

वही कहानी आप विन्यास फाइल लोड करने के लिए आप अपने प्रारूप पर नियंत्रण की कोशिश कर रहा है और कर रहे हैं के लिए Source.fromUrl(...)

चला जाता है, आप typesafe के Config उपयोगिता पर एक नजर है चाहिए।

0

आपके द्वारा प्राप्त नल पॉइंटर अपवाद getResourceAsStream वापस शून्य से है। निम्नलिखित junit.scala स्निपेट दिखाता है कि क्लास बनाम क्लासलोडर में कोई अंतर कैसे है। What is the difference between Class.getResource() and ClassLoader.getResource()? देखें। यहां मुझे लगता है कि fileName कक्षा पथ में रहने वाली फ़ाइल का नाम है, लेकिन परीक्षा चलाने वाले वर्ग के बगल में कोई फ़ाइल नहीं है।

assertTrue(getClass.getClassLoader().getResourceAsStream(fileName) != null) 
assertTrue(getClass.getClassLoader().getResourceAsStream("/" + fileName) == null) 
assertTrue(getClass.getResourceAsStream(fileName) == null) 
assertTrue(getClass.getResourceAsStream("/" + fileName) != null) 
5

इस कोड को अंत में मेरे लिए काम किया:

import java.util.Properties 
import scala.io.Source 

// ... somewhere inside module. 

var properties : Properties = null 

val url = getClass.getResource("/my.properties") 
if (url != null) { 
    val source = Source.fromURL(url) 

    properties = new Properties() 
    properties.load(source.bufferedReader()) 
} 

और अब आप सादे पुराने java.util.Properties को संभालने के लिए क्या मेरी विरासत कोड वास्तव में प्राप्त करने के लिए आवश्यक है।

0

मेरा पसंदीदा समाधान com.typesafe.scala-logging के साथ है। मैं जैसे मुख्य \ संसाधन फ़ोल्डर में एक application.conf फ़ाइल रखा है, सामग्री सहित:

services { mongo-db { retrieve = """http://xxxxxxxxxxxx""", base = """http://xxxxxx""" } }

और एक कक्षा में इसका इस्तेमाल करते हैं, पहले typesafe से config कारखाने लोड और फिर बस इसका इस्तेमाल करने की।

val conf = com.typesafe.config.ConfigFactory.load() conf.getString("services.mongo-db.base"))

आशा है कि यह मदद करता है!

Ps। मैं शर्त लगाता हूं कि एक्सटेंशन के रूप में .conf के साथ संसाधनों पर हर फ़ाइल पढ़ी जाएगी।