JavaRush /مدونة جافا /Random-AR /القراءة من لوحة المفاتيح - "القراء"

القراءة من لوحة المفاتيح - "القراء"

نشرت في المجموعة
مرحبًا! تعلمنا في المحاضرات والمهام كيفية إخراج البيانات إلى وحدة التحكم، والعكس - قراءة البيانات من لوحة المفاتيح. القراءة من لوحة المفاتيح - "القراء" - 1لقد تعلمت أيضًا استخدام البناء المعقد لهذا:
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
لكننا مازلنا لم نجيب على سؤال واحد.

كيف يعمل هذا حتى؟

في الواقع، أي برنامج في أغلب الأحيان لا يوجد في حد ذاته. يمكنه التواصل مع البرامج والأنظمة الأخرى والإنترنت وما إلى ذلك. نعني بكلمة "التواصل" في المقام الأول "تبادل البيانات". أي تلقي بعض البيانات من الخارج، وعلى العكس من ذلك، أرسل بياناتك الخاصة إلى مكان ما. هناك العديد من الأمثلة على تبادل البيانات بين البرامج، حتى في الحياة اليومية. لذلك، في العديد من المواقع، بدلاً من التسجيل، يمكنك تسجيل الدخول باستخدام حسابك على Facebook أو Twitter. في هذه الحالة، يقوم برنامجان، على سبيل المثال، Twitter والموقع الذي تحاول التسجيل فيه، بتبادل البيانات الضرورية مع بعضهما البعض، وبعد ذلك ترى النتيجة النهائية - ترخيص ناجح. غالبًا ما يستخدم مصطلح " التدفق " لوصف عملية تبادل البيانات في البرمجة . من أين أتى هذا الاسم أصلاً؟ يرتبط "التدفق" بالنهر أو الجدول أكثر من ارتباطه بالبرمجة. في الواقع، هذا ليس بدون سبب :) الدفق هو، في جوهره، قطعة متحركة من البيانات. وهذا هو، في البرمجة، ليس الماء "يتدفق" على طول الدفق، ولكن البيانات في شكل بايت وأحرف. من خلال تدفق البيانات، يمكننا تلقي البيانات في أجزاء والقيام بشيء ما بها. مرة أخرى، دعونا نستخدم تشبيه "تدفق المياه": يمكنك جمع الماء من النهر لطهي الحساء، أو إطفاء النار، أو سقاية الزهور. باستخدام التدفقات، يمكنك العمل مع أي مصدر بيانات: الإنترنت، أو نظام الملفات بجهاز الكمبيوتر الخاص بك، أو أي شيء آخر - لا يهم. التدفقات هي أداة عالمية. إنها تسمح للبرنامج باستقبال البيانات من أي مكان (التدفقات الواردة) وإرسالها إلى أي مكان (التدفقات الصادرة). مهمتهم واحدة - أخذ البيانات من مكان وإرسالها إلى مكان آخر. تنقسم التدفقات إلى نوعين:
  1. الدفق الوارد ( الإدخال ) - يستخدم لتلقي البيانات
  2. الدفق الصادر ( الإخراج ) - لإرسال البيانات.
يتم تنفيذ تدفق البيانات الواردة في Java في الفصل InputStream، وتدفق البيانات الصادرة في الفصل OutputStream. ولكن هناك طريقة أخرى لتقسيم المواضيع. وهي مقسمة ليس فقط إلى الواردة والصادرة، ولكن أيضًا إلى بايت وحرف . هنا المعنى واضح دون تفسير: ينقل دفق البايت المعلومات على شكل مجموعة من البايتات، وينقل دفق الأحرف المعلومات على شكل مجموعة من الأحرف. في هذه المحاضرة سوف نتناول بالتفصيل التدفقات الواردة. وسأرفق معلومات حول الروابط الصادرة في النهاية، ويمكنك أن تقرأ عنها بنفسك :) لذا، الكود الخاص بنا:
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
ربما كنت تعتقد أثناء قراءة المحاضرات أنها تبدو مخيفة للغاية؟ :) ولكن هذا فقط حتى نكتشف كيف يعمل هذا الشيء. دعونا إصلاحه الآن! لنبدأ من النهاية. System.inهو كائن من الفئة InputStreamالتي تحدثنا عنها في البداية. هذا دفق وارد، وهو مرتبط بجهاز إدخال النظام - لوحة المفاتيح. بالمناسبة، أنت على دراية به بشكل غير مباشر. بعد كل شيء، غالبا ما تستخدم "زميله" في عملك - System.out! System.out- هذا هو دفق إخراج بيانات النظام ، ويتم استخدامه للإخراج إلى وحدة التحكم بنفس الطريقة System.out.println()التي تستخدمها باستمرار :) System.out- دفق لإرسال البيانات إلى وحدة التحكم، و- System.inلتلقي البيانات من لوحة المفاتيح. الأمر بسيط :) علاوة على ذلك: لقراءة البيانات من لوحة المفاتيح، يمكننا الاستغناء عن هذا البناء الكبير والكتابة ببساطة: System.in.read();
public class Main {

   public static void main(String[] args) throws IOException {

       while (true) {
           int x = System.in.read();
           System.out.println(x);
       }
   }
}
يوجد في الفصل InputStream( System.inواسمح لي أن أذكرك أنه كائن من الفصل InputStream) طريقة read()تسمح لك بقراءة البيانات. مشكلة واحدة: يقرأ البايتات وليس الأحرف . دعونا نحاول قراءة الحرف الروسي "Ya" من لوحة المفاتيح. إخراج وحدة التحكم:
Я
208
175
10
تشغل الحروف الروسية 2 بايت في ذاكرة الكمبيوتر (على عكس الحروف الإنجليزية التي تشغل 1 بايت فقط). في هذه الحالة، تمت قراءة 3 بايت من الدفق: الأولين يمثلان حرفنا "I"، والآخر هو فاصل الأسطر (Enter). ولذلك، فإن خيار استخدام "العاري" System.inلن يناسبنا. لا يستطيع البشر (مع استثناءات نادرة!) قراءة البايتات. هذا هو المكان الذي يأتي فيه الفصل التالي لمساعدتنا - InputStreamReader! دعونا معرفة أي نوع من الحيوانات هذا.
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
نقوم بتمرير الدفق System.inإلى InputStreamReader. بشكل عام، إذا قمت بترجمة اسمها إلى اللغة الروسية، فكل شيء يبدو واضحا - "قارئ التدفقات الواردة". في الواقع، هذا هو بالضبط ما هو عليه! نقوم بإنشاء كائن فئة InputStreamReaderونمرره دفقًا واردًا يجب أن يقرأ البيانات منه. في هذه الحالة...
new InputStreamReader(System.in)
... نقول لها: "سوف تقرأ البيانات من دفق إدخال النظام (لوحة المفاتيح)." لكن هذه ليست وظيفتها الوحيدة! InputStreamReaderلا يتلقى فقط البيانات من الدفق. كما أنه يحول تدفقات البايت إلى تدفقات الأحرف . بمعنى آخر، لم تعد بحاجة إلى القلق بشأن ترجمة البيانات المقروءة من لغة "الكمبيوتر" إلى لغة "بشرية" - InputStreamReaderفهي ستفعل كل شيء من أجلك. InputStreamReaderبالطبع، يمكنه قراءة البيانات ليس فقط من وحدة التحكم، ولكن أيضًا من أماكن أخرى. على سبيل المثال من الملف:
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {

   public static void main(String[] args) throws IOException {
       InputStreamReader inputStreamReader = new InputStreamReader(new FileInputStream("C:\\Users\\username\\Desktop\\testFile.txt"));
   }
}
قمنا هنا بإنشاء دفق بيانات وارد FileInputStream(هذا أحد الأصناف InputStream)، وقمنا بتمرير المسار إلى الملف فيه، وقمنا بتمرير الدفق نفسه InputStreamReader'y. الآن سيكون قادرًا على قراءة البيانات من هذا الملف، إذا كان الملف الموجود في هذا المسار موجودًا بالطبع. لقراءة البيانات (بغض النظر عن مكانها أو من وحدة التحكم أو الملف أو أي مكان آخر)، InputStreamReaderيستخدم الفصل أيضًا ملحق read(). ما هو الفرق بين System.in.read()و InputStreamReader.read()؟ دعونا نحاول حساب نفس الحرف "I" باستخدام InputStreamReader. دعني أذكرك، هذا ما فكرت به System.in.read():
Я
208
175
10
كيف يمكنه القيام بنفس العمل InputStreamReader؟
public class Main {

   public static void main(String[] args) throws IOException {

       InputStreamReader reader = new InputStreamReader(System.in);
       while (true) {
           int x = reader.read();
           System.out.println(x);
       }
   }
}
إخراج وحدة التحكم:
Я
1071
10
الفرق واضح على الفور. البايت الأخير - لفواصل الأسطر - بقي دون تغيير (الرقم 10)، ولكن تم تحويل الحرف المقروء "I" إلى رمز واحد "1071". هذه هي القراءة بالرموز! إذا لم تصدق فجأة أن الرمز 1071 يعني الحرف "أنا"، فمن السهل التحقق من ذلك :)
import java.io.IOException;

public class Main {

   public static void main(String[] args) throws IOException {

       char x = 1071;
       System.out.println(x);
   }
}
إخراج وحدة التحكم:

Я
ولكن إذا InputStreamReaderكان جيدًا جدًا، فلماذا تحتاج إلى المزيد BufferedReader؟ InputStreamReaderهل يمكن قراءة البيانات وتحويل البايتات إلى أحرف - ماذا نحتاج أيضًا؟ لماذا قارئ آخر؟ : / الجواب بسيط جدًا - لزيادة الإنتاجية والراحة . لنبدأ بالأداء. عند قراءة البيانات، يستخدم BufferedReader منطقة خاصة - مخزن مؤقت، حيث "يضيف" أحرف القراءة. ونتيجة لذلك، عندما نحتاج إلى هذه الأحرف في البرنامج، سيتم أخذها من المخزن المؤقت، وليس مباشرة من مصدر البيانات (لوحة المفاتيح، الملف، وما إلى ذلك)، وهذا يوفر الكثير من الموارد. لفهم كيفية عمل ذلك، تخيل، على سبيل المثال، عمل ساعي في شركة كبيرة. يجلس الساعي في المكتب وينتظر إحضار الطرود إليه لتسليمها. في كل مرة يتلقى طردا جديدا، يمكنه الذهاب على الفور إلى الطريق. ولكن قد يكون هناك الكثير من الطرود خلال النهار، وسيتعين عليه التنقل بين المكتب والعناوين في كل مرة. وبدلاً من ذلك، وضع الساعي صندوقًا في المكتب حيث يمكن للجميع وضع طرودهم. الآن يمكن للساعي أن يأخذ الصندوق بهدوء ويذهب إلى العناوين - سيوفر الكثير من الوقت، لأنه لن يضطر إلى العودة إلى المكتب في كل مرة. المربع الموجود في هذا المثال هو بالضبط المخزن المؤقت، والمكتب هو مصدر البيانات. من الأسهل بكثير على الساعي أن يأخذ رسالة من صندوق مشترك عند تسليمها بدلاً من الذهاب إلى المكتب في كل مرة. كما أنه سيوفر الغاز. الأمر نفسه ينطبق على البرنامج - حيث أن أخذ البيانات من المخزن المؤقت أقل استهلاكًا للموارد، بدلاً من الوصول إلى مصدر البيانات في كل مرة. لهذا السبب يعمل + بشكل أسرع من مجرد . لقد قمنا بفرز الأداء، ولكن ماذا عن الراحة؟ الميزة الرئيسية هي أنه يمكنه قراءة البيانات ليس فقط حرفًا واحدًا في كل مرة (على الرغم من أن لديه أيضًا طريقة لهذا الغرض)، ولكن أيضًا سطورًا كاملة! ويتم ذلك باستخدام ; BufferedReaderInputStreamReaderInputStreamReaderBufferedReaderread()readLine()
public class Main {

   public static void main(String[] args) throws IOException {

       BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
       String s = reader.readLine();
       System.out.println("We read this line from the keyboard:");
       System.out.println(s);
   }
}
إخراج وحدة التحكم:
JavaRush is the best site to learn Java!
Мы считали с клавиатуры эту строку:
JavaRush — лучший сайт для изучения Java!
وهذا مفيد بشكل خاص عند قراءة كمية كبيرة من البيانات. لا يزال من الممكن قراءة سطر أو سطرين من النص حرفًا بحرف. لكن حساب "الحرب والسلام" حرفًا واحدًا في كل مرة سيكون مشكلة إلى حد ما :) الآن أصبح عمل الخيوط أكثر وضوحًا بالنسبة لك. لمزيد من الدراسة، هنا مصدر إضافي لك: هنا يمكنك قراءة المزيد عن التدفقات الواردة والصادرة. مراجعة فيديو BufferedReaderمن أحد طلابنا. نعم، نعم، طلابنا لا يتعلمون بأنفسهم فحسب، بل يسجلون أيضًا مقاطع فيديو تعليمية للآخرين! لا تنسى الإعجاب والاشتراك في قناتنا :)
من الأفضل أن تعتاد على قراءة الوثائق الرسمية منذ بداية دراستك. إنه المصدر الرئيسي للمعرفة حول اللغة، ويمكن دائمًا العثور على معظم الإجابات هناك.
تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION