أولاً ، اسمحوا لي أن أقدم الفرق بين InputStreamReader و Filereader. المحتوى المحدد هو كما يلي:
InputStreamReader و BufferedReader. أهم فئة من بينها هو InputStreamReader ، وهو جسر لتحويل البايت إلى أحرف. يمكنك إعادة تحديد طريقة الترميز في المنشئ. إذا لم يتم تحديدها ، فسيتم اعتماد طريقة الترميز الافتراضية لنظام التشغيل الأساسي ، مثل GBK ، إلخ.
يتضمن FileReader و InputStreamReader تحويل الترميز (حدد طريقة الترميز أو استخدم الترميز الافتراضي لنظام التشغيل) ، وقد يحدث رمز مشوه على منصات مختلفة! تتم معالجة FileInputStream في الوضع الثنائي ولن يكون لها رمز مشتعلة.
تتم قراءة تدفقات بايت FileInputStream بايت.
تتم قراءة تدفقات أحرف FileReader كحرف واحدة تلو الأخرى.
bufferedReader buFreader = null ؛ inputStreamReader isr = null ؛ fileReader fr = null ؛ try {for (اسم ملف السلسلة: أسماء الملفات) {الطريقة 1: isr = new inputStreamReader (fileInputStream جديد ("d: /test.txt") ، "utf-8") ؛ bufreader = جديد BufferedReader (ISR) ؛ الطريقة 2: fr = new fileReader ("d: /test.txt") ؛ bufreader = جديد bufferedreader (FR) ؛ بينما (buFreader.Ready ()) {// 1. احصل على كل صف من سلسلة البيانات dataline = buFreader.ReadLine () ؛ }}الفرق بين InputStream والقارئ
هناك فئتان مجردين أدناه java.io: inputstream و reader
InputStream عبارة عن طبقة فائقة تمثل جميع فئات دفق الإدخال بايت.
القارئ هو فئة مجردة لقراءة تدفقات الأحرف
يوفر InputStream قراءة تدفقات البايت ، وليس قراءة النص ، وهو الفرق الأساسي بينه وبين فئة القارئ.
أي ، تتم قراءة صفيف أو سلسلة char باستخدام القارئ ، ويتم قراءة صفيف البايت باستخدام inputStream.
بعد توضيح الفرق الأساسي بين الفطريات الفائقة ، دعونا نلقي نظرة على استخدام فئاتهما الفرعية أدناه. هنا فقط عدد قليل من التفسيرات الأكثر استخدامًا
InputStream
| __fileInputStream
FileInputStream يحصل على إدخال بايت من ملف في نظام الملفات.
ملخص أساليب البناء
FileInputStream (ملف الملف)
قم بإنشاء ملف fileInputStream عن طريق فتح اتصال بالملف الفعلي ، والذي يتم تحديده بواسطة ملف كائن الملف في نظام الملفات.
FileInputStream (FileDescriptor FDOBJ)
قم بإنشاء ملف fileInputStream باستخدام واصف الملف FDOBJ ، والذي يمثل اتصالًا موجودًا إلى ملف فعلي في نظام الملفات.
FileInputStream (اسم السلسلة)
قم بإنشاء ملف fileInputStream عن طريق فتح اتصال بالملف الفعلي ، المحدد بواسطة اسم المسار في نظام الملفات.
قارئ
|-BufferedReader
| ___ InputStreamReader
| __filereader
BufferedReader: اقرأ النص من دفق إدخال حرف وتجاوز الأحرف الفردية ، وبالتالي تمكين القراءة الفعالة للأحرف والصفائف والخطوط.
ملخص أساليب البناء
BufferedReader (القارئ في)
يقوم بإنشاء دفق إدخال حرف مخزّن يستخدم المخزن المؤقت لإدخال الحجم الافتراضي.
BufferedReader (القارئ في ، int sz)
ينشئ دفق إدخال الحرف المخزن مؤقتًا يستخدم المخزن المؤقت للإدخال المحدد.
BufferedReader (Java Platform SE 6)
أكبر ميزة في BufferedReader هي الإعداد العازلة. عادةً ما يؤدي كل طلب قراءة من قِبل القارئ إلى طلبات القراءة المقابلة للشخصية الأساسية أو دفق البايت. إذا لم يكن هناك تخزين مؤقت ، فإن كل مكالمة لقراءة () أو readline () ستؤدي إلى قراءة بايت من الملف وتحويله إلى أحرف وإعادته ، وهو أمر غير فعال للغاية.
استخدم BufferedReader لتحديد حجم المخزن المؤقت ، أو يمكن استخدام الحجم الافتراضي. في معظم الحالات ، تكون القيمة الافتراضية كبيرة بما يكفي.
لذلك ، يوصى بلف جميع القراء الذين قد تكون عمليات القراءة () باهظة الثمن (مثل Filereader و InputStreamReader) مع BufferedReader.
على سبيل المثال،
BufferedReader في = جديد BufferedReader (New FileReader ("foo.in")) ؛إدخال العازلة إلى الملف المحدد.
inputstreamreader (منصة Java SE 6)
InportStreamReader هو الجسر بين تدفقات البايت وتيارات الأحرف: إنه يقرأ البايتات باستخدام charset المحددة وتفككها في أحرف. يمكن تحديد الحرف التي تستخدمها أو يتم تقديمها بشكل صريح بواسطة الاسم ، أو يمكن أن تقبل مجموعة الأحرف الافتراضية للنظام الأساسي.
ملخص أساليب البناء
يقوم InputStreamReader (inputStream in) بإنشاء جهاز InportStreamReader الذي يستخدم مجموعة الأحرف الافتراضية. InputStreamReader (InputStream in ، Charset CS) ينشئ inputstreamreader الذي يستخدم مجموعة الأحرف المحددة. InputStreamReader (InputStream in ، CharsetDecoder DEC) ينشئ inputstreamreader يستخدم وحدة فك ترميز مجموعة الأحرف المحددة. InportStreamReader (InputStream In ، String charsetName) ينشئ inputstreamreader يستخدم مجموعة الأحرف المحددة.
كل مكالمة إلى طريقة read () في InputStreamReader تؤدي إلى قراءة واحدة أو أكثر من القراءة من دفق الإدخال الأساسي. لتمكين التحويل الفعال من البايت إلى الحرف ، يمكنك قراءة المزيد من البايتات من الدفق الأساسي مسبقًا ، وتجاوز البايتات المطلوبة لتلبية عملية القراءة الحالية.
لتحقيق أقصى قدر من الكفاءة ، فكر في لف إدخال StreamReader داخل BufferedReader. على سبيل المثال:
BufferedReader في = جديد bufferedReader (new inputStreamReader (system.in)) ؛
أكبر ميزة لـ InputStreamReader هي أنه يمكن أن يشير إلى تنسيق الترميز الثابت للتحويل ، وهو أمر غير ممكن مع فئات أخرى. يمكن أن نرى من طريقة البناء. هذا مفيد جدًا عند قراءة الأحرف الصينية.
FileReader
1) مقدمة إلى فئة Filereader:
يتم ورث الفئات الفرعية لفئة InputStreamReader ، وجميع الطرق (read () ، وما إلى ذلك) من فئة الأصل inputstreamreader ؛
2) الاختلافات من فئة InputStreamReader:
ملخص أساليب البناء
FileReader (ملف الملف)
قم بإنشاء ملف fileReader جديدًا نظرًا لقراءة البيانات منه.
FileReader (FileDescriptor FD)
قم بإنشاء قائد FileReader جديدًا نظرًا لوجود بيانات FileDescriptor التي تتم قراءة البيانات منها.
FileReader (اسم ملف السلسلة)
قم بإنشاء قائد fileReader جديدًا نظرًا لاسم الملف الذي تتم قراءة البيانات منه
الفرق الرئيسي بين هذه الفئة والفئة الأم inputStreamReader هو المنشئ ، والفرق الرئيسي هو المُنشئ!
من مُنشئ InputStreamReader ، تكون المعلمات هي طريقة الإدخال والترميز. يمكن ملاحظة أنه عندما تريد تحديد طريقة الترميز ، يجب استخدام فئة InputStreamReader ؛ ومعلمات مُنشئ FileReader هي نفس FileInputStream ، وهو كائن ملف أو سلسلة تمثل المسار. يمكن ملاحظة أنه عندما تريد قراءة ملف بناءً على كائن الملف أو السلسلة ، استخدم FileReader ؛
أعتقد أن وظيفة الفئة الفرعية FileReader تكمن في هذا التقسيم الصغير من العمل. الفرق الرئيسي بين هذه الفئة والفئة الأم inputStreamReader هو المنشئ ، والفرق الرئيسي هو المُنشئ!
من InputStreamReader
في المُنشئ ، تكون المعلمات هي طريقة الإدخال والترميز. يمكن ملاحظة أنه عندما تريد تحديد طريقة الترميز ، يجب استخدام فئة InputStreamReader ؛ ومعلمات مُنشئ FileReader هي نفس FileInputStream ، وهو كائن ملف أو سلسلة تمثل المسار. يمكن ملاحظة أنه عندما تريد قراءة ملف بناءً على كائن الملف أو السلسلة ، استخدم FileReader ؛
أعتقد أن وظيفة الفئة الفرعية FileReader تكمن في هذا التقسيم الصغير من العمل.
توصيلان واختلافات
(1) الشخصيات والبايت:
تستخدم فئة FileInputStream إدخال/إخراج ثنائي ، وسرعة الإدخال/الإخراج سريعة وفعالة ، لكن طريقة القراءة () تقرأ بايت (بيانات ثنائية) ، وهو أمر غير موات للغاية بالنسبة للأشخاص للقراءة ، ولا يمكن أن يعمل مباشرة على الشخصيات في الملف ، مثل الاستبدال والبحث (يجب أن يتم تشغيله في البايتات) ؛
تعوض فئة القارئ هذا العيب ويمكنه إدخال/إخراج في تنسيق النص ، وهو مريح للغاية ؛ على سبيل المثال ، يمكنك استخدام Low ((ch = fileReader.Read ())! =-1) حلقة لقراءة الملف ؛ يمكنك استخدام طريقة readline () من BufferreadReader لقراءة السطر النصفي.
(2) الترميز
InputStreamReader ، إنه جسر لتحويل البايت إلى أحرف. يمكنك إعادة تحديد طريقة الترميز في المنشئ. إذا لم يتم تحديدها ، فسيتم اعتماد طريقة الترميز الافتراضية لنظام التشغيل الأساسي ، مثل GBK ، إلخ.
يتضمن FileReader و InputStreamReader تحويل الترميز (حدد طريقة الترميز أو استخدم الترميز الافتراضي لنظام التشغيل) ، وقد يحدث رمز مشوه على منصات مختلفة! تتم معالجة FileInputStream في الوضع الثنائي ولن يكون لها رمز مشتعلة.
لذلك ، عند تحديد طريقة الترميز ، يجب استخدام فئة InputStreamReader ، بحيث يكون جسرًا لتحويل البايت إلى أحرف ؛
(3) منطقة ذاكرة التخزين المؤقت
يتم استخدام فئة Bufferreader لالتفاف جميع القراء الذين قد تكون عمليات القراءة () باهظة الثمن (مثل Filereader و InputStreamReader).
(4) الاستخدام الموحد
لخص ما سبق وتوصل إلى استخدام قياسي أفضل:
1) ملف = ملف جديد ("hello.txt") ؛
FileInputStream في = جديد fileInputStream (ملف) ؛
2) ملف = ملف جديد ("hello.txt") ؛
FileInputStream في = جديد fileInputStream (ملف) ؛ inputStreamReader inReader = new inputStreamReader (in ، "utf-8") ؛ BufferedReader Bufreader = جديد BufferedReader (inReader) ؛
3) ملف = ملف جديد ("hello.txt") ؛
fileReader fileReader = new fileReader (file) ؛ BufferedReader Bufreader = جديد BufferedReader (FileReader) ؛