CodeGym /مدونة جافا /Random-AR /فئة جافا برينت ستريم
John Squirrels
مستوى
San Francisco

فئة جافا برينت ستريم

نشرت في المجموعة
أهلاً! سنتحدث اليوم عن فئة Java PrintStream وكل ما يمكنها فعله. في الواقع، أنت على دراية بالطريقتين الخاصتين بفئة PrintStream . هما print() و println() ، واللتين ربما تستخدمهما كل يوم :) نظرًا لأن المتغير System.out هو كائن PrintStream ، فإنك تستدعي إحدى طرق هذه الفئة عند استدعاء System.out.println() .  الغرض العام لفئة PrintStream هو إرسال المعلومات إلى بعض الدفق. لماذا نحتاج إلى فئة PrintStream - 1هذه الفئة لديها العديد من المنشئين. وفيما يلي بعض من الأكثر استخداما:
  • برينتستريم (أوتبوتستريم أوتبوتستريم)
  • يقوم PrintStream (ملف OutputFile) بطرح FileNotFoundException
  • يقوم PrintStream (StringputFileName) بطرح FileNotFoundException
على سبيل المثال، يمكننا تمرير اسم ملف الإخراج إلى مُنشئ PrintStream . بدلا من ذلك، يمكننا تمرير كائن ملف . دعونا نلقي نظرة على بعض الأمثلة لنرى كيف يعمل هذا:
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 على سطح المكتب (إذا لم يكن موجودًا بالفعل) ويكتب فيه الرقم والسلسلة والقيمة المنطقية بالتسلسل. وهذه محتويات الملف بعد تشغيل البرنامج:

222 
Hello world!
false
كما قلنا أعلاه، ليس عليك تمرير كائن ملف . يكفي ببساطة تمرير مسار الملف إلى المنشئ:
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\\Steve\\Desktop\\test.txt");

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

       printStream.printf("My name is %s. I am %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. I am %d!";

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

       PrintStream printStream = new PrintStream("C:\\Users\\Steve\\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 من أجل إعادة توجيه مخرجات النظام إلى أي مكان نريده. قد تنسى ما هو System.in ، لكن لن ينسى أي طالب في CodeGym هذا البناء:
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
System.in  (تمامًا مثل System.out ) هو متغير ثابت لفئة النظام . ولكن على عكس System.out ، فهو يشير إلى فئة أخرى، وهي InputStream . بشكل افتراضي، System.in هو دفق يقرأ البيانات من جهاز النظام - لوحة المفاتيح. ومع ذلك، تمامًا كما هو الحال مع System.out ، يمكننا استبدال لوحة المفاتيح كمصدر للبيانات. يمكننا قراءة البيانات من أي مكان نريد! لنلقي نظرة على مثال:
import java.io.*;

public class Main {

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

       String greetings = "Hi! My name is Amigo!\nI'm learning Java on the CodeGym website.\nOne day I will become a cool programmer!\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 . إنه بسيط، واسمه وحده يخبرنا كيف يعمل: مصدر بياناته هو مصفوفة بايت. لذلك نقوم بإنشاء مصفوفة بايت ونمررها إلى منشئ الدفق الذي سيقرأ البيانات. والآن كل شيء جاهز! الآن نحتاج فقط إلى استخدام طريقة 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