لماذا نستخدم BufferedReader
القراءة مع التخزين المؤقت وبدونه
لماذا نستخدم BufferedReader درس مجاني في Java Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Java Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Java Academy 4 دروس في المجموع.
قراءة الإدخال في Java
تحتاج معظم البرامج العملية إلى إدخال من المستخدم: اسم أو رقم أو أمر. توفر Java عدة طرق لقراءة الإدخال، لكن من أكثرها شيوعًا وكفاءة BufferedReader.
في هذا الدرس ستتعلم سبب وجود BufferedReader ومتى تلجأ إليه.
مصدر الإدخال
عندما تكتب في وحدة التحكم، يتدفق النص الذي تكتبه عبر System.in. وهذا تدفق بايتات منخفض المستوى؛ إذ يوفر بايتات خامًا لا نصًا سهل القراءة.
لتحويل تلك البايتات إلى محارف مقروءة وأسطر كاملة، نغلف System.in داخل أصناف مساعدة. وBufferedReader هو الغلاف الذي يجعل ذلك سهلًا.
ما معنى Buffered
تُعد قراءة بايت واحد في كل مرة من لوحة المفاتيح أو من ملف بطيئة. أما المخزن المؤقت فهو جزء من الذاكرة يحتفظ بعدد كبير من المحارف في آن واحد.
يملأ BufferedReader هذا المخزن المؤقت على دفعات كبيرة، ثم يزوّدك بالبيانات بسرعة. ويعني تقليل مرات الوصول إلى التدفق الأساسي أداءً أفضل، خصوصًا عند التعامل مع إدخال كبير.
الإعداد ذو الطبقتين
لا يستطيع BufferedReader قراءة System.in مباشرة، لأن ذلك التدفق يوفر بايتات. لذلك نغلفه أولًا داخل InputStreamReader، الذي يحوّل البايتات إلى محارف.
System.in→ بايتاتInputStreamReader→ محارفBufferedReader→ أسطر مخزنة مؤقتًا
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(isr);السطر الواحد التقليدي
سترى هذا السطر نفسه تقريبًا في كل برنامج Java يقرأ إدخالًا من وحدة التحكم. فهو يربط الغلافين في عبارة واحدة.
تذكّر: يتولى InputStreamReader الداخلي تحويل البايتات إلى محارف، بينما يضيف BufferedReader الخارجي التخزين المؤقت، بالإضافة إلى الطريقة المفيدة readLine().
BufferedReader br =
new BufferedReader(new InputStreamReader(System.in));عبارات الاستيراد المطلوبة
توجد هذه الأصناف في الحزمة java.io، لذلك يجب استيرادها في أعلى الملف.
قد تفشل قراءة الإدخال، لذلك ترمي الطرق الاستثناء IOException؛ وستحتاج إلى استيراده أو معالجته أيضًا، وسنغطي ذلك لاحقًا.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;BufferedReader مقارنةً بـ Scanner
يتعرف المبتدئون غالبًا إلى Scanner أولًا. فهو أسهل استخدامًا، إذ يستطيع تحليل الأرقام مباشرة، لكنه أبطأ.
- Scanner: تحليل سهل، لكن مع تكلفة إضافية أكبر.
- BufferedReader: أسرع ويقرأ الأسطر كاملة، لكن عليك تحليل الأرقام بنفسك.
عند التعامل مع إدخال كبير أو البرمجة التنافسية، يتفوق BufferedReader من حيث السرعة.
قراءة سطر كامل
الطريقة الأساسية هي readLine(). فهي تقرأ كل ما يكتبه المستخدم حتى يضغط Enter، ثم تعيده على هيئة String (من دون محرف السطر الجديد).
إذا لم يتبقَّ إدخال، تعيد readLine() القيمة null. وسنستكشف ذلك في الدرس التالي.
String name = br.readLine();
System.out.println("Hello, " + name);برنامج قراءة كامل
إليك برنامجًا كاملًا. يقرأ سطرًا واحدًا ويرحب بالمستخدم. لاحظ وجود throws IOException في main؛ فهذه طريقة سريعة للسماح بانتقال أخطاء الإدخال إلى الأعلى أثناء التعلم.
ينتظر هذا المقطع إدخالًا من لوحة المفاتيح، لذلك لا يمكن تشغيله تلقائيًا هنا، لكنه Java صالح.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br =
new BufferedReader(new InputStreamReader(System.in));
String name = br.readLine();
System.out.println("Hi " + name);
}
}لا حاجة إلى إدخال لإثبات عمله
للتأكد من وجود الأغلفة وتجميعها، إليك نسخة قابلة للتشغيل لا تقرأ أي شيء؛ بل تكتفي بالتأكد من إنشاء الكائن.
في تطبيق حقيقي ستستدعي readLine()، لكن هذه النسخة تطبع رسالة حتى تتمكن من تشغيلها الآن.
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) {
BufferedReader br =
new BufferedReader(new InputStreamReader(System.in));
System.out.println("BufferedReader is ready!");
}
}متى تستخدم BufferedReader
استخدم BufferedReader عندما:
- تقرأ أسطرًا كثيرة أو ملفات كبيرة،
- تهتم بالسرعة،
- تريد التعامل البسيط مع النص سطرًا بسطر.
استخدم Scanner بدلًا منه عندما تريد تحليل الأرقام بسرعة ويكون الإدخال صغيرًا. كلاهما صالح؛ فاختر الأداة المناسبة.
اختبار سريع
اختبر فهمك لإعداد BufferedReader.
مراجعة
تعلمت أن System.in هو تدفق بايتات، يغلّفه InputStreamReader (من البايتات إلى المحارف)، ثم BufferedReader (للتخزين المؤقت بالإضافة إلى readLine()).
يعزز التخزين المؤقت الأداء، ويتألق BufferedReader عند التعامل مع الإدخال الكبير أو القائم على الأسطر. التالي: قراءة الأسطر بالتفصيل.
الأسئلة الشائعة
هل درس «لماذا نستخدم BufferedReader» مجاني؟
نعم — نص درس «لماذا نستخدم BufferedReader» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Java Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Java Academy 4 دروس في المجموع.
ماذا ستتعلم في «لماذا نستخدم BufferedReader»؟
القراءة مع التخزين المؤقت وبدونه تتمرن على Java Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Java Academy؟
لا تُشترط خبرة سابقة. Java Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «لماذا نستخدم BufferedReader»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Java Academy هذا؟
نعم. كل درس في Java Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- لماذا نستخدم BufferedReader
- قراءة الأسطر
- تحليل الأرقام من الإدخال
- إغلاق التدفقات بأمان