2010-12-16 5 views
20

कई उदाहरण में, यह वर्णन किया गया है कि आप इस तरह से एक पूरी फाइल पढ़ने में scala.io.Source उपयोग कर सकते हैं:scala.io.Source का उपयोग करने का सही तरीका क्या है?

val str = scala.io.Source.fromFile("test.txt").mkString() 

लेकिन अंतर्निहित धारा को बंद करने का उल्लेख नहीं है। स्कैला ऐसा करने का सुविधाजनक तरीका क्यों नहीं देता है जैसे पायथन में क्लॉज के साथ? यह उपयोगी लग रहा है लेकिन मुश्किल नहीं है।

क्या स्कैला में सुरक्षित रूप से ऐसा करने का कोई और बेहतर तरीका है, मेरा मतलब है कि पूरी फाइल पढ़नी है?

+0

बनाता है यह सही स्रोत इस तरह से अंतर्निहित धारा को बंद नहीं उपयोग करने के लिए है? – woods

+4

यदि आप scala.io.Source के कोड को पढ़ते हैं, तो आप पाएंगे कि वास्तव में यह आपके लिए अंतर्निहित धारा को बंद करने का काम छोड़ देता है। गजब का! – woods

उत्तर

18

स्कैला की io लाइब्रेरी सीमित आवश्यकताओं के लिए समर्थन प्रदान करने के लिए बस हैक किया गया था। स्कैला को एक अच्छी तरह से सोचा आईओ लाइब्रेरी प्रदान करने का प्रयास किया गया था, जिसे वर्तमान में assembla पर होस्ट किया गया है, जिसमें github भंडार भी है।

यदि आप अल्पकालिक प्रक्रियाओं पर कभी-कभी फ़ाइल पढ़ने से ज्यादा कुछ भी करने के लिए I/O का उपयोग करने जा रहे हैं, तो आप या तो जावा पुस्तकालयों का उपयोग बेहतर करेंगे, या वर्तमान में कंपाइलर में उपलब्ध I/O समर्थन को देखेंगे (जिसके लिए ऐप के साथ वितरित करने के लिए scala-compiler.jar की आवश्यकता होगी)।

स्वचालित संसाधन प्रबंधन के लिए, this question पर, या this library पर देखें (जो उस प्रश्न के स्वीकृत उत्तर में दिखाया गया है)।

+1

क्या आप अभी भी 2016 तक scala.io का उपयोग न करने की सलाह देंगे? – knub

+3

@knub मैंने स्काला 2.12 को नहीं देखा है कि यह देखने के लिए कि क्या कुछ सुधार हुआ है, लेकिन, अन्यथा, हाँ, मैं एक ही सिफारिश से खड़ा हूं। –

20

पूर्णता

val testTxtSource = scala.io.Source.fromFile("test.txt") 
val str = testTxtSource.mkString() 
testTxtSource.close() 

की खातिर बातें किया मिलना चाहिए।

+5

क्या यह 'कोशिश' ब्लॉक में नहीं होना चाहिए और 'अंत में 'ब्लॉक में' बंद()' होना चाहिए? – robinst

+1

@robinst यह एक अच्छी बात होगी और मैं डैनियल के उत्तर से सहमत हूं (यानी scala.io.Source का उपयोग न करें) हालांकि, यह हमारे डोजोस में उपयोगी हो गया है जहां हम उत्पादन कोड नहीं लिखते हैं। इसके अलावा, मैं एक एआरएम लाइब्रेरी का उपयोग करूंगा ('try'' catch' 'की बजाय) क्योंकि' क्लोज़() 'अपवाद भी फेंक सकता है और मुझे अंततः' कोशिश ''अंत में'' अंत में '' '। – matyjas

2

मैं using the using की सलाह देते हैं, जो आपके कोड neater और अधिक विश्वसनीय

using(Source.fromFile("test.txt")){ _.mkString()}