Сәлеметсіз бе! Бүгін біз сынып
PrintStream
және оның жасай алатын барлық нәрселері туралы сөйлесеміз. Шын мәнінде, сіз сыныптың екі әдісімен бұрыннан таныссыз PrintStream
. Бұл сіз күнде қолданатын әдістер :) Айнымалы мән an object болғандықтан print()
, әдісті шақырған кезде , сіз осы нақты сыныптың әдісін шақырасыз. Класстың жалпы мақсаты - белгілі бір ағынға ақпаратты шығару. Бұл сыныпта бірнеше конструктор бар. Мұнда ең көп таралғандардың бірнешеуі берілген: println()
System.out
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
сол жерде біздің нөмірді, жолды және -айнымалы мәнді дәйекті түрде жазады. Бағдарлама іске қосылғаннан кейін файлымыздың мазмұны мыналар:
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);
}
}
Бұл code алдыңғы 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.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 массиві. stream
Сондықтан біз дәл осы byte массивін жасаймыз және оны деректерді оқитын конструкторымызға береміз . Шын мәнінде, бәрі дайын! 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);
}
Бірақ сіз оны қазір іске қосқан кезде, бағдарламадағы мәтін жай ғана консольге шығарылатынын көресіз, пернетақтадан оқу болмайды. Біз деректер көзін өзгерттік, енді бұл пернетақта емес, біздің жолымыз! Бұл өте оңай және қарапайым :) Бүгінгі дәрісте біз жаңа сыныппен таныстық және енгізу/шығарумен жұмыс істеуге арналған жаңа шағын «бұзуды» қарастырдық. Курсқа қайта оралу және кейбір мәселелерді шешу уақыты :) Келесі дәрісте кездескенше!
GO TO FULL VERSION