CodeGym /وبلاگ جاوا /Random-FA /کلاس جاوا PrintStream
John Squirrels
مرحله
San Francisco

کلاس جاوا PrintStream

در گروه منتشر شد
سلام! امروز در مورد کلاس Java PrintStream و هر کاری که می تواند انجام دهد صحبت خواهیم کرد. در واقع، شما قبلاً با دو روش کلاس PrintStream آشنا هستید . آنها print() و println() هستند که احتمالاً هر روز از آنها استفاده می کنید :) از آنجا که متغیر System.out یک شی PrintStream است، هنگام فراخوانی System.out.println() یکی از متدهای این کلاس را فراخوانی می کنید .  هدف کلی کلاس PrintStream ارسال اطلاعات به برخی جریان ها است. چرا ما به کلاس PrintStream نیاز داریم - 1این کلاس چندین سازنده دارد. در اینجا برخی از متداول ترین آنها آورده شده است:
  • PrintStream (OutputStream outputStream)
  • PrintStream (File outputFile) FileNotFoundException را پرتاب می کند
  • PrintStream (String outputFileName) 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 را روی دسکتاپ ایجاد می کند (اگر قبلا وجود نداشته باشد) و به ترتیب شماره، رشته و بولین ما را روی آن می نویسد. در اینجا محتویات فایل پس از اجرای برنامه آمده است:

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