تحلل هذه المقالة الفرق بين تدفقات الأحرف وتيارات البايت في Java للرجوع إليها. المحتوى المحدد كما يلي
1. ما هو التدفق
الدفق في Java هو تجريد من تسلسل البايت. يمكننا أن نتخيل أن هناك أنبوب ماء ، ولكن الآن لم يعد يتدفق المياه في أنبوب الماء ، ولكن تسلسل بايت. مثل تدفقات الماء ، فإن الجداول في جافا لها أيضًا "اتجاه من التدفق". يسمى كائن يمكن من خلاله قراءة تسلسل بايت دفق إدخال ؛ يسمى كائن يتم كتابة تسلسل بايت إليه دفق الإخراج.
2. تيار بايت
الوحدة الأساسية لمعالجة دفق البايت في Java هي بايت واحد ، والذي عادة ما يتم استخدامه لمعالجة البيانات الثنائية. إن فئتي دفق البايت الأساسيين في Java هما InputStream و OutputStream ، والتي تمثل مجموعة تدفقات البايت الأساسية وتدفقات بايت الإخراج ، على التوالي. كل من فئة InputStream وفئة OutputStream هي فئات مجردة. في الاستخدام الفعلي ، عادة ما نستخدم سلسلة من الفئات الفرعية المقدمة في مكتبة فئة Java. دعنا نأخذ فئة InputStream كمثال لتقديم دفق البايت في Java.
تحدد فئة InputStream طريقة أساسية للقراءة لقراءة بايت من دفق بايت. تعريف هذه الطريقة كما يلي:
الملخص العام int read () يلقي ioException ؛
هذه طريقة مجردة ، أي فئة دفق بايت مدخلات مستمدة من InputStream يحتاج إلى تنفيذ هذه الطريقة. تتمثل وظيفة هذه الطريقة في قراءة بايت من دفق البايت ، وإرجاع -1 إذا وصلت إلى النهاية ، وإلا بإرجاع بايت القراءة. ما نحتاج إلى ملاحظته حول هذه الطريقة هو أنه سيستمر في حظر وإعادة بايت قراءة أو -1. بالإضافة إلى ذلك ، لا تدعم تدفقات البايت التخزين المؤقت افتراضيًا ، مما يعني أنه في كل مرة تسمى طريقة القراءة ، سيطلب نظام التشغيل نظام التشغيل لقراءة بايت واحد ، والذي يرافقه غالبًا القرص IO ، لذلك سيكون غير فعال نسبيًا. قد يعتقد بعض الأصدقاء أن الطريقة الزائدة للقراءة في فئة InputStream مع صفيف البايت حيث يمكن للمعلمات قراءة بايت متعددة في وقت واحد بدون قرص متكرر IO. فهل هذا هو الحال؟ لنلقي نظرة على الكود المصدري لهذه الطريقة:
القراءة العامة (البايت ب []) يلقي ioException {return read (b ، 0 ، b.length) ؛}يستدعي إصدارًا آخر من طريقة القراءة الزائدة ، لذلك سنستمر في متابعة:
int public read (byte b [] ، int Off ، int len) يلقي ioException {if (b == null) {throw nullpointerxception () ؛ } آخر إذا (OFF <0 || len <0 || len> } آخر إذا (len == 0) {return 0 ؛ } int c = read () ؛ if (c == -1) {return -1 ؛ } b [OFF] = (byte) c ؛ int i = 1 ؛ حاول {for (؛ i <len ؛ i ++) {c = read () ؛ if (c == -1) {break ؛ } b [OFF + I] = (byte) c ؛ }} catch (ioException ee) {} return i ؛ }من الكود أعلاه ، يمكننا أن نرى أنه في الواقع ، تستخدم طريقة القراءة (البايت []) أيضًا حلقة لاستدعاء طريقة القراءة () للقراءة في صفيف البايت "في وقت واحد" ، لذلك لا تستخدم هذه الطريقة بشكل أساسي مخزن مؤقت للذاكرة. لاستخدام المخازن المؤقتة للذاكرة لتحسين كفاءة القراءة ، يجب أن نستخدم BufferedInputStream.
3. دفق الشخصية
الوحدة الأساسية لمعالجة دفق الأحرف في Java هي رمز Unicode (2 بايت في الحجم) ، والذي عادة ما يتم استخدامه لمعالجة البيانات النصية. ما يسمى رمز Unicode هو وحدة رمز Unicode مع نطاق من 0x0000 ~ 0xFFFF. كل رقم في النطاق أعلاه يتوافق مع حرف. يقوم نوع السلسلة في Java بتشفير الأحرف في قواعد Unicode افتراضيًا ثم يخزنها في الذاكرة. ومع ذلك ، على عكس التخزين في الذاكرة ، فإن البيانات المخزنة على القرص عادة ما يكون لها طرق تشفير مختلفة. باستخدام طرق تشفير مختلفة ، سيكون لدى نفس الأحرف تمثيلات ثنائية مختلفة. في الواقع ، تعمل تدفقات الأحرف مثل هذا:
دفق حرف الإخراج: قم بتحويل تسلسل الأحرف (في الواقع تسلسل رمز Unicode) إلى تسلسل البايت ضمن طريقة الترميز المحددة ، ثم اكتبه إلى الملف ؛
دفق حرف الإدخال: فك تشفير تسلسل البايت المراد قراءته في تسلسل الأحرف المقابل (في الواقع تسلسل رمز Unicode) في طريقة الترميز المحددة بحيث يمكن تخزينها في الذاكرة.
نستخدم عرضًا تجريبيًا لتعميق فهمنا لهذه العملية. رمز العينة كما يلي:
استيراد java.io.filewriter ؛ استيراد java.io.ioException ؛ فئة عامة filewriterdemo {public static void main (string [] args) {filewriter filewriter = null ؛ حاول {try {filewRiter = new filewRiter ("demo.txt") ؛ filewriter.write ("Demo") ؛ } أخيرًا {filewRiter.close () ؛ }} catch (ioException e) {E.PrintStackTrace () ؛ }}}في الكود أعلاه ، نستخدم FilewRiter لكتابة الأحرف الأربعة "Demo" إلى Demo.txt. نستخدم محرر سداسي عشري وينهكس لعرض محتوى demo.txt:
كما يتضح من الشكل أعلاه ، يتم ترميز "العرض التوضيحي" الذي كتبناه على أنه "64 65 6D 6F" ، لكننا لا نحدد بشكل صريح طريقة الترميز في الكود أعلاه. في الواقع ، عندما لا نحدد ، يتم استخدام طريقة تشفير الأحرف الافتراضية لنظام التشغيل لتشفير الأحرف التي نريد كتابتها.
نظرًا لأن دفق الأحرف يحتاج فعليًا إلى إكمال تحويل تسلسل رمز Unicode إلى طريقة الترميز المقابلة قبل الإخراج ، فسيستخدم مخزن مؤقت للذاكرة لتخزين تسلسل البايت المحول ، وانتظر إكمال التحويل قبل الكتابة إلى ملف القرص معًا.
4. الفرق بين دفق الأحرف ودفق البايت
بعد الوصف أعلاه ، يمكننا أن نعرف أن الاختلافات الرئيسية بين تدفقات البايت وتيارات الأحرف تنعكس في الجوانب التالية:
الوحدة الأساسية لتشغيل دفق البايت هي البايتات ؛ الوحدة الأساسية لتشغيل دفق الأحرف هي رموز Unicode.
بشكل افتراضي ، لا يستخدم دفق البايت المخازن المؤقتة ؛ يستخدم دفق الأحرف المخازن المؤقتة.
عادة ما يستخدم دفق البايت لمعالجة البيانات الثنائية. في الواقع ، يمكن أن يعالج أي نوع من البيانات ، لكنه لا يدعم كتابة أو قراءة رموز Unicode مباشرة ؛ عادةً ما يقوم دفق الأحرف بمعالجة البيانات النصية ، والتي تدعم كتابة رموز Unicode وقراءةها.
ما سبق هو بعض من فهمي لتدفقات الشخصية وتيارات البايت في جافا. إذا كان هناك أي أوصاف غير واضحة أو غير دقيقة ، آمل أن تتمكن من تصحيحها. شكرًا لك.