2013-10-26 5 views
12

नए जावा 8 का उपयोग कर फ़ाइल में सभी लाइनों को मुद्रित करने का सबसे पसंदीदा और संक्षिप्त तरीका क्या है?जावा 8 का उपयोग करना, फ़ाइल में सभी लाइनों को प्रिंट करने का सबसे पसंदीदा और संक्षिप्त तरीका क्या है?

उत्पादन में के रूप में फ़ाइल की एक प्रतिलिपि, लाइन के लिए लाइन में होना चाहिए:

[Line 1 ...] 
[Line 2 ...] 

सवाल lambdas भले ही पुराने संस्करणों में यह करने के तरीके के साथ जावा-8 से संबंधित है। दिखाएं कि जावा -8 क्या है!

+0

क्योंकि जावा प्रोग्राम के भीतर कार्य किया जा रहा है। जाहिर है, अगर आप एमएस-डॉस या बीएएसएच में हैं, तो बिल्ली फ़ाइल काम करती है। लेकिन आप जानते थे कि :) –

उत्तर

27

यह एक प्रयास में एक लैम्ब्डा के साथ नए स्ट्रीम का उपयोग करता है।

मैं कहूंगा कि यह सबसे पसंदीदा और संक्षिप्त तरीके वजह से है:

1) यह स्वचालित रूप से धारा जब किया बंद करें और ठीक से किसी भी अपवाद फेंक देते हैं।

2) इसका उत्पादन आलसी है। अंतिम पंक्ति संसाधित होने के बाद प्रत्येक पंक्ति को पढ़ा जाता है। यह मूल जावा स्ट्रीम आधारित फ़ाइल हैंडलिंग spec के करीब भी है।

3) यह प्रत्येक पंक्ति को इस तरीके से प्रिंट करता है जो फ़ाइल में डेटा के सबसे नज़दीक दिखता है।

4) यह कम स्मृति-गहन है, क्योंकि यह एक मध्यवर्ती सूची या इस तरह के Files.readAllLines (...)

5) यह सबसे लचीला है के रूप में सरणी का निर्माण नहीं करता क्योंकि स्ट्रीम प्रदान की वस्तु है कई अन्य उपयोग करता है और कार्यों डेटा (रूपांतरण, संग्रह, विधेय, आदि)

try (Stream<String> stream = Files.lines(Paths.get("sample.txt"),Charset.defaultCharset())) { 
      stream.forEach(System.out::println); 
} 

के साथ काम करने के लिए पथ और चारसेट प्रदान की जाती हैं और उपभोक्ता किसी भी वस्तु ले जा सकते हैं तो यह भी काम करता है:

try (Stream stream = Files.lines(path,charset)) { 
      stream.forEach(System.out::println); 
} 

त्रुटि हैंडलिंग के साथ:

try (Stream<String> stream = Files.lines(Paths.get("sample.txt"),Charset.defaultCharset())) { 
      stream.forEach(System.out::println); 
} catch (IOException ex) { 
     // do something with exception 
} 
+1

'क्लोजेबलस्ट्रीम' को जावा 8 के हाल के संस्करणों से हटा दिया गया है। हालांकि सभी स्ट्रीम' ऑटोक्लोसेबल 'हैं, इसलिए इन्हें अभी भी संसाधनों के साथ-साथ संसाधनों के निर्माण के साथ उपयोग किया जा सकता है। आपको सिर्फ यह जानना होगा कि किन स्ट्रीमों को वास्तव में बंद करने की आवश्यकता है। –

+0

जानकारी के लिए धन्यवाद। मैं सिर्फ स्ट्रीम का उपयोग करने के लिए बदल गया है। –

10

आप वास्तव में जावा 8 की जरूरत नहीं है:

System.out.println(Files.readAllLines(path, charset)); 

तुम सच में एक धारा का उपयोग करें या एक क्लीनर प्रस्तुति की जरूरत करना चाहते हैं:

Files.readAllLines(path, charset).forEach(System.out::println); 
+1

निश्चित रूप से, वे काम करते हैं। कुछ वैकल्पिक तरीकों को दिखाने के लिए धन्यवाद। हालांकि, सवाल जावा 8 का उपयोग करने का सबसे अच्छा तरीका है - जावा 8 आवश्यक नहीं है। अब, आपका उत्तर पहले सभी पंक्तियों को पढ़ता है और जावा 8 विधि आलसी है और अधिक मेमोरी सुरक्षित है। इसके अलावा, Files.readAllLines का उपयोग करके (..) एक ऐरे या सूची देता है और प्रिंटिंग यह बदसूरत है और फ़ाइल लाइन को लाइन के रूप में प्रिंट करने जैसा नहीं है। तो, फ़ाइल को पढ़ने, लाइन से लाइन और इसे प्रिंट करने के सबसे पसंदीदा और पारंपरिक व्यवहार को बनाए रखने के लिए, जावा 8 विधि सर्वोत्तम दिखती है। –

+4

दूसरा कोड स्निपेट बदसूरत प्रिंटिंग समस्या को संबोधित करता है। आलस्य के लिए, यह आपके उपयोग के मामले पर निर्भर करता है - अगर फ़ाइल बहुत बड़ी नहीं है तो यह वास्तव में आवश्यक नहीं है। YMMV। – assylias

+0

बहुत सच है और अगर मैं इतना गुदा नहीं था, तो मैं कहूंगा कि आपकी दूसरी विधि कोड के लिए सबसे आसान है। मुझे वास्तव में नई स्ट्रीम एपीआई पसंद है और इसमें कुछ आसान विशेषताएं हैं जो जावा 8 ऑफर करती हैं। तो मुझे लगता है कि यह एक करीबी टाई है :) –

5

यहां एक साधारण समाधान है:

System.out.println(new String(Files.readAllBytes(Paths.get("sample.java")))); 
+0

यह उत्तर पहले ही प्रदान किया जा चुका है, लेकिन आसान है। – gknicker

+0

फाइल क्लास और readAllBytes विधि का उपयोग कर Nio 2 के साथ यह समाधान किसी भी पिछली प्रतिक्रिया में प्रदान नहीं किया गया था !!! आपकी टिप्पणी में एक गलती हुई है, gknicker !! –

+0

'readAllLines'' readAllFiles' नहीं है, और 'नया स्ट्रिंग()' एक 'अक्षरसेट' तर्क भी ले सकता है। –

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

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