2017-06-14 15 views
8

मेरी विशेष कार्य के लिए की स्ट्रीम को FileChannel से सभी लाइनों पढ़ें, मैं String की की एक Stream (या Collection) को FileChannel से डेटा पढ़ने की जरूरत है।तार

एक नियमित NIO में एक Path के लिए हम एक सुविधाजनक तरीका Files.lines(...) जो एक Stream<String> रिटर्न उपयोग कर सकते हैं। मैं एक ही परिणाम प्राप्त करने की आवश्यकता है, लेकिन एक FileChannelPath के बजाय से:

public static Stream<String> lines(final FileChannel channel) { 
//... 
} 

कोई भी विचार कैसे ऐसा करने के लिए?

उत्तर

8

मैं आप चाहते हैं जब लौटे Stream बंद कर दिया है चैनल को बंद करना पड़ा मान है, तो सबसे सरल दृष्टिकोण

public static Stream<String> lines(FileChannel channel) { 
    BufferedReader br = new BufferedReader(Channels.newReader(channel, "UTF-8")); 
    return br.lines().onClose(() -> { 
     try { br.close(); } 
     catch (IOException ex) { throw new UncheckedIOException(ex); } 
    }); 
} 

यह वास्तव में की आवश्यकता नहीं है एक FileChannel इनपुट के रूप में, एक ReadableByteChannel पर्याप्त है किया जाएगा।

ध्यान दें कि यह "नियमित एनआईओ" से संबंधित है; java.nio.file कभी-कभी referred to as “NIO.2” होता है।

+2

ओह डर्न, आपने हमारे कोड बेस में 'ऑनक्लोस' के माध्यम से बस एक बग को सही किया है। धन्यवाद – Eugene