JavaRush /בלוג Java /Random-HE /לשם מה מיועד מחלקת 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. ואנחנו מעבירים את הנתונים שאמורים להיות במקומות האלה כפרמטרים. במקרה שלנו, זו המחרוזת " אמיגו " והמספר 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ולנתב את פלט המערכת למקום שאנו צריכים. למה מיועדת מחלקת PrintStream? - 2אולי שכחת מה זה System.in, אבל אף תלמיד JavaRush לא ישכח לעולם את הבנייה הזו:
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
System.in(like 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