JavaRush /Java блогу /Random-KY /PrintStream классы эмне үчүн?

PrintStream классы эмне үчүн?

Группада жарыяланган
Салам! Бүгүн биз класс PrintStreamжана ал жасай ала турган нерселердин бардыгы жөнүндө сүйлөшөбүз. PrintStream классы эмне үчүн - 1Чынында, сиз класстын эки ыкмасы менен таанышсыз PrintStream. print()Бул, балким println(), сиз күн сайын колдоно турган ыкмалар :) Өзгөрмө System.outan object болгондуктан PrintStream, методду чакырганда System.out.println(), сиз ушул класстын ыкмасын чакырасыз. Класстын жалпы максаты PrintStreamмаалыматты кандайдыр бир агымга чыгаруу болуп саналат. Бул класста бир нече конструктор бар. Бул жерде эң кеңири таралгандардын бир нечеси:
  • PrintStream(OutputStream outputStream)
  • PrintStream(File outputFile) throws FileNotFoundException
  • PrintStream(String outputFileName) throws FileNotFoundException
Көрүнүп тургандай, биз an objectтин конструкторуна өтө алабыз PrintStream, мисалы, биз маалыматтарды чыгаргыбыз келген файлдын атын. Же болбосо, an objectтин өзү 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);
   }
}
Бул code иш тактасында файлды түзөт test.txt(эгерде ал жок болсо) жана booleanал жерге катар менен биздин санды, сапты жана -variableди жазат. Бул программа иштегенден кийин биздин файлдын мазмуну:

222
Hello world!
false
Жогоруда айткандай, файл an objectинин өзүнөн өтүүнүн кереги жок 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);
   }
}
Бул code мурункудай эле кылат. Карай турган дагы бир кызыктуу ыкма , 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.in spoofing

Бул лекцияда биз "система менен күрөшөбүз" жана өзгөрмөнү кантип алмаштырууну 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клавиатурага "байланган". Бирок биз маалыматтардын клавиатурадан окулушун каалабайбыз: ал тексттин кадимки саптарынан окулсун! Биз сап түздүк жана аны byte массиви катары алдык. Эмне үчүн бизге byteтар керек? Чынында, бул InputStreamабстракттуу класс жана биз анын мисалын түзө албайбыз. Сиз анын мураскорлорунун ичинен кандайдыр бир классты тандап алышыңыз керек болот. Мисалы, биз ала алабыз ByteArrayInputStream. Бул жөнөкөй жана анын аты менен эле анын кандайча иштээри түшүнүктүү: анын маалымат булагы byte массиви. Ошентип, биз ошол эле byte массивди түзүп, аны конструкторубузга өткөрүп беребиз stream, ал маалыматтарды окуйт. Чынында, баары даяр! System.setIn()Эми биз жөн гана өзгөрмөнүн маанисин так коюу үчүн ыкманы колдонушубуз керек in. Эгер эсиңизде болсо out, өзгөрмөнүн маанисин коюу мүмкүн эмес болчу: сиз атайын ыкманы колдонушуңуз керек болчу setOut(). InputStreamБиз түзгөн өзгөрмөлөрдү дайындагандан кийин System.in, биздин идеянын иштегенин текшеришибиз керек. Бул жагынан бизге эски дос жардам берет - BufferedReader. Кадимки кырдаалда бул code сиздин 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