JavaRush /مدونة جافا /Random-AR /ما هي فئة PrintStream؟

ما هي فئة PrintStream؟

نشرت في المجموعة
مرحبًا! سنتحدث اليوم عن الفصل PrintStreamوكل ما يمكنه فعله. ما هي فئة PrintStream لـ - 1في الواقع، أنت على دراية بطريقتين للفصل PrintStream. print()هذه هي الطرق println()التي ربما تستخدمها كل يوم :) نظرًا لأن المتغير System.outهو كائن PrintStream، فعندما تستدعي أسلوبًا System.out.println()، فإنك تستدعي أسلوبًا من هذه الفئة المعينة. الغرض العام من الفصل PrintStreamهو إخراج المعلومات إلى بعض الدفق. هذه الفئة لديها العديد من المنشئين. فيما يلي بعض من أكثرها شيوعًا:
  • PrintStream(OutputStream outputStream)
  • PrintStream(File outputFile) throws FileNotFoundException
  • PrintStream(String outputFileName) throws FileNotFoundException
كما ترون، يمكننا أن نمرر إلى منشئ الكائن PrintStream، على سبيل المثال، اسم الملف الذي نريد إخراج البيانات إليه. أو، بدلا من ذلك، الكائن نفسه File. دعونا نلقي نظرة على كيفية عمل ذلك مع الأمثلة:
import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintStream;

public class Main {

   public static void main(String arr[]) throws FileNotFoundException
   {
       PrintStream filePrintStream = new PrintStream(new File("C:\\Users\\Username\\Desktop\\test.txt"));

       filePrintStream.println(222);
       filePrintStream.println("Hello world");
       filePrintStream.println(false);
   }
}
سيقوم هذا الرمز بإنشاء ملف على سطح المكتب test.txt(إذا لم يكن موجودًا بالفعل) ويكتب الرقم والسلسلة booleanوالمتغير هناك بالتسلسل. فيما يلي محتويات الملف الخاص بنا بعد تشغيل البرنامج:

222
Hello world!
false
كما قلنا أعلاه، ليس من الضروري تمرير كائن الملف نفسه File. تحتاج فقط إلى تحديد المسار إليه في المُنشئ:
import java.io.FileNotFoundException;
import java.io.PrintStream;

public class Main {

   public static void main(String arr[]) throws FileNotFoundException
   {
       PrintStream filePrintStream = new PrintStream("C:\\Users\\Username\\Desktop\\test.txt");

       filePrintStream.println(222);
       filePrintStream.println("Hello world");
       filePrintStream.println(false);
   }
}
هذا الكود سوف يفعل نفس الكود السابق طريقة أخرى مثيرة للاهتمام يجب النظر إليها هي printf()إخراج السلسلة المنسقة. ماذا تعني "السلسلة المنسقة"؟ وللتوضيح سأعطي مثالا:
import java.io.IOException;
import java.io.PrintStream;

public class Main {

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

       PrintStream printStream = new PrintStream("C:\\Users\\Евгений\\Desktop\\test.txt");

       printStream.println("Hello!");
       printStream.println("I'm robot!");

       printStream.printf("My name is %s, my age is %d!", "Amigo", 18);

       printStream.close();

   }
}
هنا، بدلًا من تدوين اسم الروبوت الخاص بنا وعمره بشكل صريح في سطر، يبدو أننا نترك "مساحة حرة" لهذه المعلومات باستخدام المؤشرات %sو %d. ونقوم بتمرير البيانات التي يجب أن تكون في هذه الأماكن كمعلمات. في حالتنا، هذه هي السلسلة النصية " Amigo " والرقم 18. يمكننا، على سبيل المثال، إنشاء مسافة أخرى: على سبيل المثال %b، وتمرير معلمة أخرى. لما هذا؟ بادئ ذي بدء، لزيادة المرونة. إذا كان برنامجك يحتاج إلى عرض رسالة ترحيب بشكل متكرر، فسيتعين عليك إدخال النص المطلوب يدويًا لكل روبوت جديد. لن تتمكن حتى من تحويل هذا النص إلى ثابت: أسماء وأعمار كل شخص مختلفة! لكن باستخدام الطريقة الجديدة، يمكنك إخراج سلسلة تحتوي على تحية إلى ثابت، وإذا لزم الأمر، قم ببساطة بتغيير المعلمات في الطريقة printf().
import java.io.IOException;
import java.io.PrintStream;

public class Main {

   private static final String GREETINGS_MESSAGE = "My name is %s, my age is %d!";

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

       PrintStream printStream = new PrintStream("C:\\Users\\Евгений\\Desktop\\test.txt");

       printStream.println("Hello!");
       printStream.println("We are robots!");

       printStream.printf(GREETINGS_MESSAGE, "Amigo", 18);
       printStream.printf(GREETINGS_MESSAGE, "R2-D2", 35);
       printStream.printf(GREETINGS_MESSAGE, "C-3PO", 35);

       printStream.close();
   }
}

System.in الانتحال

في هذه المحاضرة سوف نقوم "بمحاربة النظام" وسنتعلم كيفية استبدال المتغير System.inوإعادة توجيه مخرجات النظام إلى المكان الذي نحتاجه. ما هي فئة PrintStream؟ - 2ربما تكون قد نسيت ما هو عليه System.in، لكن لن ينسى أي طالب في JavaRush هذا البناء:
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
System.in(مثل System.out) هو متغير فئة ثابتة System. ولكن، على عكس System.out, فهو ينتمي إلى فئة مختلفة، وهي InputStream. بشكل افتراضي System.in، هذا هو الخيط الذي يقرأ البيانات من جهاز النظام — لوحة المفاتيح. ومع ذلك، كما في حالة System.out، يمكننا استبدال مصدر البيانات، ولن تتم القراءة من لوحة المفاتيح، بل من المكان الذي نحتاجه! لنلقي نظرة على مثال:
import java.io.*;

public class Main {

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

       String greetings = "Hello! Меня зовут Амиго!\nЯ изучаю Java на сайте JavaRush.\nОднажды я стану крутым программистом!\n";
       byte[] bytes = greetings.getBytes();

       InputStream inputStream = new ByteArrayInputStream(bytes);

       System.setIn(inputStream);

       BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

       String str;

       while ((str = reader.readLine())!= null) {

           System.out.println(str);
       }

   }
}
إذا، مالذي فعلناه؟ عادة System.in"مربوطة" بلوحة المفاتيح. لكننا لا نريد قراءة البيانات من لوحة المفاتيح: دعها تُقرأ من سطر عادي من النص! لقد أنشأنا سلسلة واستقبلناها كمصفوفة بايت. لماذا نحتاج بايت؟ الحقيقة هي أنها InputStreamفئة مجردة، ولا يمكننا إنشاء مثيل لها. سيكون عليك اختيار فئة معينة من بين ورثتها. على سبيل المثال، يمكننا أن نأخذ ByteArrayInputStream. إنه بسيط، ومن خلال اسمه فقط يتضح كيف يعمل: مصدر بياناته هو مصفوفة بايت. لذلك نقوم بإنشاء نفس مصفوفة البايت ونمررها إلى المُنشئ streamالذي سيقرأ البيانات. في الواقع، كل شيء جاهز بالفعل! الآن نحتاج فقط إلى استخدام الطريقة System.setIn()لتعيين قيمة المتغير بشكل صريح in. في حالة out، كما تتذكر، كان من المستحيل تحديد قيمة المتغير أيضًا: كان عليك استخدام طريقة خاصة setOut(). بعد أن قمنا بتعيين InputStreamالمتغير الذي أنشأناه System.in، نحتاج إلى التحقق مما إذا كانت فكرتنا قد نجحت. صديق قديم سوف يساعدنا في هذا - BufferedReader. في الوضع الطبيعي، قد يتسبب هذا الرمز في فتح وحدة التحكم في Intellij IDEa الخاصة بك، وسيتم قراءة البيانات التي أدخلتها من لوحة المفاتيح من هناك.
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

       String str;

       while ((str = reader.readLine())!= null) {

           System.out.println(str);
       }
ولكن عند تشغيله الآن، سترى أن النص الخاص بنا من البرنامج سيتم ببساطة إخراجه إلى وحدة التحكم، ولن تكون هناك قراءة من لوحة المفاتيح. لقد قمنا بتغيير مصدر البيانات، والآن ليس لوحة المفاتيح، ولكن سلسلة لدينا! الأمر سهل وبسيط للغاية :) في محاضرة اليوم تعرفنا على فصل جديد ونظرنا إلى "اختراق" صغير جديد للعمل مع الإدخال/الإخراج. حان الوقت للعودة إلى الدورة وحل بعض المشكلات :) نراكم في المحاضرة القادمة!
تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION