अंक पहले से ही BaseStream के संबंध में किए गए वैध और महत्वपूर्ण हैं। हालांकि, ऐसी स्थितियां हैं जिनमें आप एक पाठ पढ़ना चाहते हैं और जानते हैं कि आप कहां हैं। यह अभी भी इसे पुन: उपयोग करने में आसान बनाने के लिए कक्षा के रूप में लिखने के लिए उपयोगी हो सकता है।
मैं अब इस तरह के एक वर्ग लिखने का प्रयास किया। ऐसा लगता है कि यह सही ढंग से काम करता है, लेकिन यह धीमा है। यह ठीक हो जाना चाहिए जब प्रदर्शन महत्वपूर्ण नहीं है (यह नहीं है कि धीमी गति से, नीचे देखें)।
मैं परवाह किए बिना पाठ में स्थिति को ट्रैक करने के लिए यदि आप एक समय में एक बफर, या एक बार में एक पंक्ति एक समय में एक चार पढ़ा है, एक ही तर्क का उपयोग करें। हालांकि मुझे यकीन है कि इसे छोड़कर इसे बेहतर प्रदर्शन करने के लिए बनाया जा सकता है, इसने इसे लागू करने के लिए बहुत आसान बना दिया ... और, मुझे आशा है कि कोड का पालन करें।
मैंने StreamReader को रीडलाइन विधि (जो मुझे लगता है कि इस कार्यान्वयन का सबसे कमजोर बिंदु है) की एक बहुत ही बुनियादी प्रदर्शन तुलना की है, और अंतर लगभग परिमाण का एक क्रम है। मुझे अपनी कक्षा StreamReaderEx का उपयोग करके 22 एमबी/एस मिल गया है, लेकिन स्ट्रीमराइडर का उपयोग करके लगभग 9 गुना अधिक (मेरे एसएसडी-सुसज्जित लैपटॉप पर)। हालांकि यह दिलचस्प हो सकता है, मुझे नहीं पता कि उचित पढ़ने का परीक्षण कैसे किया जाए; शायद 2 समान फाइलों का उपयोग कर, प्रत्येक डिस्क बफर से बड़ा है, और उन्हें वैकल्पिक रूप से पढ़ रहा है ..? कम से कम मेरा सरल परीक्षण लगातार परिणाम उत्पन्न करता है जब मैं इसे कई बार चलाता हूं, और इस पर ध्यान दिए बिना कि कौन सी कक्षा पहले टेस्ट फ़ाइल पढ़ती है।
न्यूलाइन प्रतीक पर्यावरण के लिए डिफ़ॉल्ट है। न्यूलाइन लेकिन लंबाई 1 या 2 की किसी भी स्ट्रिंग पर सेट किया जा सकता है। पाठक केवल इस प्रतीक को एक नई लाइन के रूप में मानता है, जो एक दोष हो सकता है। कम से कम मुझे पता है कि विजुअल स्टूडियो ने मुझे उचित समय दिया है कि एक फ़ाइल जिसे मैं खोलता हूं "में असंगत न्यूलाइन है"।
कृपया ध्यान दें कि मैं गार्ड वर्ग शामिल नहीं है; यह एक साधारण उपयोगिता वर्ग है और इसे संदर्भ से अपवित्र होना चाहिए कि इसे कैसे बदला जाए। आप इसे भी हटा सकते हैं, लेकिन आप कुछ तर्क जांच खो देंगे और इस प्रकार परिणामी कोड "सही" से आगे होगा। उदाहरण के लिए, Guard.NotNull (रों, "एस") बस की जाँच करता है कि रों (तर्क नाम "एस", इसलिए दूसरा पैरामीटर के साथ) एक ArgumentNullException फेंकने यह मामला हो सकता है, अशक्त नहीं है।
public class StreamReaderEx : StreamReader
{
// NewLine characters (magic value -1: "not used").
int newLine1, newLine2;
// The last character read was the first character of the NewLine symbol AND we are using a two-character symbol.
bool insideNewLine;
// StringBuilder used for ReadLine implementation.
StringBuilder lineBuilder = new StringBuilder();
public StreamReaderEx(string path, string newLine = "\r\n") : base(path)
{
init(newLine);
}
public StreamReaderEx(Stream s, string newLine = "\r\n") : base(s)
{
init(newLine);
}
public string NewLine
{
get { return "" + (char)newLine1 + (char)newLine2; }
private set
{
Guard.NotNull(value, "value");
Guard.Range(value.Length, 1, 2, "Only 1 to 2 character NewLine symbols are supported.");
newLine1 = value[0];
newLine2 = (value.Length == 2 ? value[1] : -1);
}
}
public int LineNumber { get; private set; }
public int LinePosition { get; private set; }
public override int Read()
{
int next = base.Read();
trackTextPosition(next);
return next;
}
public override int Read(char[] buffer, int index, int count)
{
int n = base.Read(buffer, index, count);
for (int i = 0; i
यह 'सेक' का उपयोग करने के लिए भी खाता नहीं है। –