Salom! Bugun biz sinf
PrintStream
va u qila oladigan barcha narsalar haqida gaplashamiz. Aslida, siz allaqachon sinfning ikkita usuli bilan tanishsiz PrintStream
. Bu siz har kuni ishlatadigan usullar print()
va usullardir :) O'zgaruvchi ob'ekt bo'lgani uchun metodni chaqirganingizda , siz ushbu sinfning usulini chaqirasiz. Sinfning umumiy maqsadi ma'lumotni qandaydir oqimga chiqarishdir. Bu sinfda bir nechta konstruktorlar mavjud. Bu erda eng keng tarqalgan bir nechtasi: println()
System.out
PrintStream
System.out.println()
PrintStream
PrintStream(OutputStream outputStream)
PrintStream(File outputFile) throws FileNotFoundException
PrintStream(String outputFileName) throws FileNotFoundException
PrintStream
, masalan, biz ma'lumotlarni chiqarmoqchi bo'lgan fayl nomi. Yoki, muqobil ravishda, ob'ektning o'zi File
. Keling, bu qanday ishlashini misollar bilan ko'rib chiqaylik:
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);
}
}
Ushbu kod ish stolida fayl yaratadi test.txt
(agar u allaqachon mavjud bo'lmasa) va boolean
u erga ketma-ket raqamimizni, qatorni va -variableni yozadi. Dastur ishga tushirilgandan so'ng faylimizning mazmuni:
222
Hello world!
false
Yuqorida aytib o'tganimizdek, fayl ob'ektini o'zi o'tkazish shart emas File
. Konstruktorda unga yo'lni ko'rsatish kifoya:
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);
}
}
Ushbu kod avvalgisi bilan bir xil ishlaydi. Ko'rib chiqishning yana bir qiziqarli usuli , printf()
yoki formatlangan satr chiqishi. "Formatlangan satr" nimani anglatadi? Tushuntirish uchun men misol keltiraman:
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();
}
}
Bu yerda, robotimizning nomi va yoshini bir qatorga aniq yozish o'rniga, biz ko'rsatgichlardan foydalanib, ushbu ma'lumot uchun "bo'sh joy" qoldirganga %s
o'xshaymiz %d
. Va biz bu joylarda bo'lishi kerak bo'lgan ma'lumotlarni parametr sifatida o'tkazamiz. Bizning holatda, bu " Amigo " qatori va 18 raqami. Biz, masalan, boshqa bo'shliqni yaratishimiz mumkin: aytaylik, %b
, va boshqa parametrni o'tkazamiz. Bu nima uchun? Avvalo, moslashuvchanlikni oshirish. Agar dasturingiz tez-tez salomlash xabarini ko'rsatishi kerak bo'lsa, har bir yangi robot uchun kerakli matnni qo'lda kiritishingiz kerak bo'ladi. Siz hatto bu matnni doimiy holatga keltira olmaysiz: har kimning ismlari va yoshi har xil! Ammo yangi usuldan foydalanib, siz salom bilan satrni doimiyga chiqarishingiz mumkin va agar kerak bo'lsa, usuldagi parametrlarni o'zgartirishingiz mumkin 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
Ushbu ma'ruzada biz "tizimga qarshi kurashamiz" va o'zgaruvchini qanday almashtirishniSystem.in
va tizim chiqishini kerakli joyga yo'naltirishni o'rganamiz. Siz bu nima ekanligini unutgan bo'lishingiz mumkin System.in
, ammo JavaRush dasturining hech bir talabasi bu qurilishni hech qachon unutmaydi:
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
System.in
(kabi System.out
) statik sinf o'zgaruvchisidir System
. Ammo, dan farqli o'laroq System.out
, u boshqa sinfga, ya'ni ga tegishli InputStream
. Odatiy bo'lib System.in
, bu tizim qurilmasi - klaviaturadan ma'lumotlarni o'qiydi. Biroq, misolida bo'lgani kabi System.out
, biz ma'lumotlar manbasini almashtirishimiz mumkin va o'qish klaviaturadan emas, balki kerakli joydan amalga oshiriladi! Keling, bir misolni ko'rib chiqaylik:
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);
}
}
}
Xo'sh, biz nima qildik? Odatda System.in
klaviaturaga "bog'langan". Lekin biz ma'lumotlar klaviaturadan o'qilishini xohlamaymiz: uni oddiy matn qatoridan o'qishga ruxsat bering! Biz satr yaratdik va uni bayt massivi sifatida oldik. Nima uchun bizga baytlar kerak? Gap shundaki InputStream
, bu mavhum sinf va biz uning namunasini yarata olmaymiz. Siz uning merosxo'rlari orasidan biron bir sinfni tanlashingiz kerak bo'ladi. Misol uchun, biz olishimiz mumkin ByteArrayInputStream
. Bu oddiy va faqat nomi bilan uning qanday ishlashi aniq: uning ma'lumotlar manbai bayt massividir. Shunday qilib, biz xuddi shu bayt massivini yaratamiz va uni konstruktorimizga o'tkazamiz stream
, u ma'lumotlarni o'qiydi. Aslida, hamma narsa allaqachon tayyor! System.setIn()
Endi biz faqat o'zgaruvchining qiymatini aniq belgilash uchun usuldan foydalanishimiz kerak in
. Esingizda bo'lsa out
, o'zgaruvchining qiymatini belgilash ham mumkin emas edi: siz maxsus usuldan foydalanishingiz kerak edi setOut()
. InputStream
Biz yaratgan o'zgaruvchini tayinlaganimizdan so'ng System.in
, bizning fikrimiz ishlaganligini tekshirishimiz kerak. Bunda bizga eski do'st yordam beradi - BufferedReader
. Oddiy holatda, bu kod sizning Intellij IDEa-da konsolning ochilishiga olib keladi va siz klaviaturadan kiritgan ma'lumotlar u erdan o'qiladi.
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String str;
while ((str = reader.readLine())!= null) {
System.out.println(str);
}
Ammo hozir uni ishga tushirganingizda, dasturdagi matnimiz shunchaki konsolga chiqishini, klaviaturadan o'qish bo'lmasligini ko'rasiz. Biz ma'lumotlar manbasini o'zgartirdik, endi bu klaviatura emas, balki bizning satrimiz! Bu juda oson va sodda :) Bugungi ma'ruzada biz yangi sinf bilan tanishdik va I/U bilan ishlash uchun yangi kichik "hack" ni ko'rib chiqdik. Kursga qaytish va ba'zi muammolarni hal qilish vaqti keldi :) Keyingi ma'ruzada ko'rishguncha!
GO TO FULL VERSION