2014-04-24 3 views
11

मैं वर्तमान में केवल एक फ़ाइल से लाइनों को पढ़ने की कोशिश कर रहा हूं जो मेरे पास है। मैंने एक और स्टैक ओवरफ्लो (Reading a plain text file in Java) पर पाया है कि आप Files.lines (..) के लिए उपयोग कर सकते हैं। (..) हालांकि मैं वास्तव में यह नहीं समझ सकता कि प्रत्येक पाठ के लिए लाइन टेक्स्ट द्वारा लाइन पढ़ने के लिए कैसे उपयोग किया जाए, कोई भी जानता है कहां देखना है या ऐसा कैसे करना है?Files.lines (...) के साथ फ़ाइलों से कैसे पढ़ा जाए। प्रत्येक (...) के लिए?

+0

पद्धति पहले से ही फ़ाइल की प्रत्येक पंक्ति पढ़ रही है यही कारण है कि, आप एक 'स्ट्रिंग' चर में लाइन स्टोर और इसके साथ कुछ और कर सकते हैं ... –

+0

Uhm, आप जावा 8 और lambdas के बारे में पढ़ा जाना चाहिए, विशेष रूप से यहां, लगभग 'उपभोक्ता' और एकल सार विधि की धारणा – fge

उत्तर

1

Files.lines(Path)Path तर्क की अपेक्षा करता है और Stream<String> देता है। Stream#forEach(Consumer)Consumer तर्क की अपेक्षा करता है। तो इसे Consumer पास करके, विधि का आह्वान करें। उस वस्तु को प्रत्येक पंक्ति के लिए जो करना चाहते हैं उसे करने के लिए लागू किया जाना होगा।

यह जावा 8 है, इसलिए आप Consumer तर्क प्रदान करने के लिए लैम्ब्डा अभिव्यक्तियों या विधि संदर्भों का उपयोग कर सकते हैं। test.txt की

23

नमूना सामग्री

Hello 
Stack 
Over 
Flow 
com 

कोड इस पाठ lines() और forEach() तरीकों का उपयोग कर फ़ाइल से पढ़ने का।

import java.io.IOException; 
import java.nio.file.Files; 
import java.nio.file.Path; 
import java.nio.file.Paths; 
import java.util.stream.Stream; 

public class FileLambda { 

    public static void main(String JavaLatte[]) { 
     Path path = Paths.get("/root/test.txt"); 
     try (Stream<String> lines = Files.lines(path)) { 
      lines.forEach(s -> System.out.println(s)); 
     } catch (IOException ex) { 
      // do something or re-throw... 
     } 
    } 
} 
+3

आप विधि संदर्भ का उपयोग कर सकते हैं: 'System.out :: println', फिर भी इसका एक ही बाइटकोड में अनुवाद किया जाएगा। –

+1

और एक और बिंदु: आपको 'स्ट्रीम' को चर के रूप में स्टोर नहीं करना चाहिए क्योंकि यह कुछ पाठकों को इसे दो बार या अधिक बार उपयोग करने में भ्रमित कर सकता है, जो प्रतिबंधित है। इसके बजाय, आप इसे 'readAllLines' के साथ' सूची 'में सहेज सकते हैं, फिर इस सूची में विधि' स्ट्रीम() 'का उपयोग करें। –

+8

यह सुनिश्चित करने के लिए स्ट्रीम के लिए प्रयास करें कि यह ऑटो-बंद हो जाता है: 'कोशिश करें (स्ट्रीम लाइनें = फ़ाइलें.लाइन (पथ)) {' – odoepner

1
साथ

जावा 8, फ़ाइल में मौजूद रहने पर एक classpath:

Files.lines(Paths.get(ClassLoader.getSystemResource("input.txt") 
        .toURI())).forEach(System.out::println); 
1

मैं एक नमूना है, आप फ़िल्टर करना/

public class ReadFileLines { 
    public static void main(String[] args) throws IOException { 
     Stream<String> lines = Files.lines(Paths.get("C:/SelfStudy/Input.txt")); 
//  System.out.println(lines.filter(str -> str.contains("SELECT")).count()); 

//Stream gets closed once you have run the count method. 
     System.out.println(lines.parallel().filter(str -> str.contains("Delete")).count()); 
    } 
} 

नमूना इनपुट स्ट्रीम उपयोग कर सकते हैं बनाया है ।टेक्स्ट।

SELECT Every thing 
Delete Every thing 
Delete Every thing 
Delete Every thing 
Delete Every thing 
Delete Every thing 
Delete Every thing 
संबंधित मुद्दे