मैं एक बार में एक बाइट या एक कैरेक्टर को संसाधित करने के लिए InputStream
के आसपास java.util.streams.Stream
लपेटना चाहता हूं। मुझे ऐसा करने का कोई आसान तरीका नहीं मिला।मैं इनपुट 8 स्ट्रीम के साथ जावा 8 स्ट्रीम का उपयोग कैसे कर सकता हूं?
निम्नलिखित अभ्यास पर विचार करें: हम प्रत्येक फ़ाइल को टेक्स्ट फ़ाइल में कितनी बार प्रकट करते हैं, इसकी गणना करना चाहते हैं। हम इसे एक सरणी में संग्रहीत कर सकते हैं ताकि tally[0]
फ़ाइल में दिखाई देने वाली संख्या को संग्रहीत करेगा, tally[1]
समय बी की संख्या प्रदर्शित करता है और इसी तरह।
int[] tally = new int[26];
Stream<String> lines = Files.lines(Path.get(aFile)).map(s -> s.toLowerCase());
Consumer<String> charCount = new Consumer<String>() {
public void accept(String t) {
for(int i=0; i<t.length(); i++)
if(Character.isLetter(t.charAt(i))
tall[t.charAt(i) - 'a' ]++;
}
};
lines.forEach(charCount);
वहाँ lines
विधि का उपयोग कर के बिना इस को पूरा करने का एक तरीका है: जब से मैं सीधे फ़ाइल स्ट्रीमिंग का एक तरीका नहीं मिल सकता है, मैं इस किया था? क्या मैं पाठ फ़ाइल में प्रत्येक पंक्ति के लिए स्ट्रिंग बनाने के बजाय सीधे प्रत्येक चरित्र को स्ट्रीम या स्ट्रीम के रूप में संसाधित कर सकता हूं।
क्या मैं java.io.InputStream
को java.util.Stream.stream
में और अधिक सख्ती से परिवर्तित कर सकता हूं?
सावधान रहें! 'Character.isLetter' केवल' a-z' से अधिक के लिए 'सत्य' देता है, उदा। 'ä' या' π'। – Holger
ठीक है, मैंने सोचा था कि पहले कम मामले में कनवर्ट करना उस पर ध्यान रखेगा। शायद मैं चाहता हूँ .isLowerCase? – Thorn
नहीं, बिंदु यह है कि जावा यूनिकोड का उपयोग करता है और 26 से अधिक अक्षर हैं। लोअरकेस में रूपांतरण उनके लिए सही काम करेगा, उदा। ''Ä'' से' 'ä'' और' 'Π'' से' π'' में कनवर्ट करें। लेकिन यदि आप ''a'' और' z 'के बीच 26 मानों को गिनना चाहते हैं तो आपको केवल' isLetter' का उपयोग करने के बजाय उस सीमा के लिए जांच करना चाहिए (जैसे मैंने अपने उत्तर में किया था)। ''ä'' और' 'π'' * * लोअरकेस अक्षर हैं ... – Holger