CodeGym /בלוג Java /Random-HE /כיתת Java PrintStream
John Squirrels
רָמָה
San Francisco

כיתת Java 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