Салам! Бүгүн биз класс
PrintStream
жана ал жасай ала турган нерселердин бардыгы жөнүндө сүйлөшөбүз. Чынында, сиз класстын эки ыкмасы менен таанышсыз PrintStream
. print()
Бул, балким println()
, сиз күн сайын колдоно турган ыкмалар :) Өзгөрмө System.out
an object болгондуктан PrintStream
, методду чакырганда System.out.println()
, сиз ушул класстын ыкмасын чакырасыз. Класстын жалпы максаты PrintStream
маалыматты кандайдыр бир агымга чыгаруу болуп саналат. Бул класста бир нече конструктор бар. Бул жерде эң кеңири таралгандардын бир нечеси:
PrintStream(OutputStream outputStream)
PrintStream(File outputFile) throws FileNotFoundException
PrintStream(String outputFileName) throws FileNotFoundException
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
жана системанын чыгышын керектүү жерге багыттоону үйрөнөбүз. Сиз бул эмне экенин унутуп калгандырсыз 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 менен иштөө үчүн жаңы кичинекей “хакке” карадык. Курска кайтып келип, кээ бир көйгөйлөрдү чечүүгө убакыт келди :) Кийинки лекцияда көрүшкөнчө!
GO TO FULL VERSION