JavaRush /وبلاگ جاوا /Random-FA /کلاس 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.در جعل

در این سخنرانی ما "با سیستم مبارزه می کنیم" و یاد می گیریم که چگونه یک متغیر را جایگزین کنیم 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);
       }
اما وقتی اکنون آن را اجرا کنید، می بینید که متن ما از برنامه به سادگی به کنسول خروجی می شود، هیچ خواندنی از صفحه کلید وجود نخواهد داشت. ما منبع داده را تغییر داده ایم، اکنون صفحه کلید نیست، رشته ماست! این بسیار آسان و ساده است :) در سخنرانی امروز ما با یک کلاس جدید آشنا شدیم و به یک "هک" کوچک جدید برای کار با I/O نگاه کردیم. زمان بازگشت به دوره و حل برخی از مشکلات است :) شما را در سخنرانی بعدی می بینیم!
نظرات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION