JavaRush /Блоги Java /Random-TG /Синфи 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дар он ҷо рақам, сатр ва -тағирёбандаи моро пайдарпай нависед. Инҳоянд мундариҷаи файли мо пас аз иҷрои барнома:

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