Salom! Bugungi ma'ruza ikki qismga bo'linadi. Biz avvalroq to'xtalib o'tgan eski mavzularni takrorlaymiz va yangi xususiyatlarni ko'rib chiqamiz :) Birinchisidan boshlaylik. Takrorlash - o'rganishning onasi :) Siz allaqachon bunday sinfdan foydalangansiz
BufferedReader
. Umid qilamanki, siz hali ham bu buyruqni unutmagansiz:
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
System.in, InputStreamReader, BufferedReader
Keyinchalik o'qishdan oldin, har bir komponent ( ) nima uchun mas'ul ekanligini va ular nima uchun kerakligini eslab ko'ring . Bo'ldimi? Agar yo'q bo'lsa, tashvishlanmang :) Agar shu paytgacha biror narsani unutgan bo'lsangiz, o'quvchilarga bag'ishlangan ushbu ma'ruzani qayta o'qing. Keling, ularning har biri nima qila olishini qisqacha eslaylik. System.in
klaviaturadan ma'lumotlarni qabul qilish uchun ipdir. Aslida, matnni o'qish mantiqini amalga oshirish uchun bizga bittasi kifoya qiladi. Ammo, siz eslayotganingizdek, System.in
u belgilarni emas, balki faqat baytlarni o'qiy oladi:
public class Main {
public static void main(String[] args) throws IOException {
while (true) {
int x = System.in.read();
System.out.println(x);
}
}
}
Agar biz ushbu kodni ishga tushirsak va konsolga "Y" harfini kiritsak, chiqish quyidagicha bo'ladi:
Й
208
153
10
Kirillcha belgilar xotirada 2 baytni egallaydi, ular ekranda ko'rsatiladi (va 10 raqami qatorlar uzilishining bayt ifodasidir, ya'ni Enter tugmasini bosing). Baytlarni o'qish juda yoqimli, shuning uchun uni System.in
sof shaklda ishlatish noqulay bo'ladi. Hamma uchun tushunarli bo'lgan kirill (va nafaqat) harflarni o'qish uchun biz InputStreamReader
o'rash sifatida foydalanamiz:
public class Main {
public static void main(String[] args) throws IOException {
InputStreamReader reader = new InputStreamReader(System.in);
while (true) {
int x = reader.read();
System.out.println(x);
}
}
}
Agar biz konsolga bir xil "Y" harfini kiritsak, bu safargi natija boshqacha bo'ladi:
Й
1049
10
InputStreamReader
ikkita o'qilgan baytni (208, 153) bitta 1049 raqamiga aylantirdi. Bu belgilar bo'yicha o'qiladi. 1049 "Y" harfiga to'g'ri keladi, uni osongina tekshirish mumkin:
public class Main {
public static void main(String[] args) throws IOException {
char x = 1049;
System.out.println(x);
}
}
Konsol chiqishi:
Й
BufferedReader
Xo'sh, "a" (va umuman - BufferedAnything) ga kelsak , buferlangan sinflar ishlashni optimallashtirish uchun ishlatiladi. Ma'lumotlar manbasiga (fayl, konsol, Internetdagi resurs) kirish ishlash jihatidan ancha qimmat operatsiya hisoblanadi. Shuning uchun, bunday qo'ng'iroqlar sonini kamaytirish uchun BufferedReader
u ma'lumotlarni maxsus buferda o'qiydi va to'playdi, biz uni keyinchalik qabul qilishimiz mumkin. Natijada, ma'lumotlar manbasiga qo'ng'iroqlar soni bir necha marta yoki hatto o'nlab marta kamayadi! "A" ning yana bir qo'shimcha xususiyati BufferedReader
va uning odatdagidan ustunligi - bu ma'lumotlarni alohida raqamlar sifatida emas, balki butun satrlar sifatida o'qiydigan InputStreamReader
juda foydali usul . readLine()
Bu, albatta, katta hajmdagi matnni amalga oshirishda katta qulaylik yaratadi. Satrni o'qish shunday ko'rinadi:
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String s = reader.readLine();
System.out.println("Пользователь ввел следующий текст:");
System.out.println(s);
reader.close();
}
}
BufferedReader+InputStreamReader работает быстрее, чем просто InputStreamReader
Пользователь ввел следующий текст:
BufferedReader+InputStreamReader работает быстрее, чем просто InputStreamReader
Albatta, BufferedReader
bu juda moslashuvchan mexanizm bo'lib, nafaqat klaviatura bilan ishlashga imkon beradi. Siz ma'lumotlarni, masalan, kerakli URL-manzilni o'quvchiga yuborish orqali to'g'ridan-to'g'ri Internetdan o'qishingiz mumkin:
public class URLReader {
public static void main(String[] args) throws Exception {
URL oracle = new URL("https://www.oracle.com/index.html");
BufferedReader in = new BufferedReader(
new InputStreamReader(oracle.openStream()));
String inputLine;
while ((inputLine = in.readLine()) != null)
System.out.println(inputLine);
in.close();
}
}
Siz faylga yo'lni o'tkazish orqali ma'lumotlarni o'qishingiz mumkin:
public class Main {
public static void main(String[] args) throws Exception {
FileInputStream fileInputStream = new FileInputStream("testFile.txt");
BufferedReader reader = new BufferedReader(new InputStreamReader(fileInputStream));
String str;
while ((str = reader.readLine()) != null) {
System.out.println (str);
}
reader.close();
}
}
System.out-ni almashtirish
Endi biz ilgari to'xtalmagan bir qiziqarli imkoniyatni ko'rib chiqaylik. Esingizda bo'lsa kerak,System
sinfda ikkita statik maydon mavjud - System.in
va System.out
. Bu egizak aka-uka ip sinfi ob'ektlari. System.in
- abstrakt sinf InputStream
. A System.out
- sinf PrintStream
. Endi biz bu haqda alohida gaplashamiz System.out
. Agar biz sinfning manba kodiga kirsak System
, biz buni ko'ramiz:
public final class System {
……………...
public final static PrintStream out = null;
…………
}
Shunday qilib, System.out
oddiy statik sinf o'zgaruvchisiSystem
. Unda sehr yo'q :) O'zgaruvchi out
sinfga tegishli PrintStream
. Qiziqarli savol tug'iladi: nima uchun kodni bajarishda System.out.println()
chiqish boshqa joyda emas, balki konsolda paydo bo'ladi? Va buni qandaydir tarzda o'zgartirish mumkinmi? Misol uchun, biz konsoldan ma'lumotlarni o'qib, matn fayliga yozmoqchimiz. Bunday mantiqni qo'shimcha o'quvchi va yozuvchi sinflaridan foydalanmasdan, balki oddiygina ishlatmasdan qandaydir tarzda amalga oshirish mumkinmi System.out
? Hali ham iloji boricha :) Va o'zgaruvchi System.out
modifikator tomonidan belgilangan bo'lsa ham final
, biz buni baribir qila olamiz! Xo'sh, buning uchun bizga nima kerak? BirinchidanPrintStream
, bizga joriy ob'ekt o'rniga yangi sinf ob'ekti kerak . Sinfda System
sukut bo'yicha o'rnatilgan joriy ob'ekt bizga mos kelmaydi: u konsolga ishora qiladi. Matn faylini ma'lumotlarimiz uchun "manzil" sifatida ko'rsatadigan yangisini yaratishimiz kerak. Ikkinchidan , o'zgaruvchiga yangi qiymatni qanday belgilash kerakligini tushunishingiz kerak System.out
. Siz buni shunchaki qila olmaysiz, chunki u belgilangan final
. Keling, oxiridan boshlaylik. Sinf System
bizga kerak bo'lgan usulni o'z ichiga oladi - setOut()
. U ob'ektni kirish sifatida qabul qiladi PrintStream
va uni chiqish nuqtasi sifatida o'rnatadi. Bizga kerak bo'lgan narsa! Faqatgina ob'ektni yaratish qoladi PrintStream
. Buni qilish ham oson:
PrintStream filePrintStream = new PrintStream(new File("C:\\Users\\Username\\Desktop\\test.txt"));
Butun kod quyidagicha ko'rinadi:
public class SystemRedirectService {
public static void main(String arr[]) throws FileNotFoundException
{
PrintStream filePrintStream = new PrintStream(new File("C:\\Users\\Username\\Desktop\\test.txt"));
/*Сохраним текущее meaning System.out в отдельную переменную, чтобы потом
можно было переключиться обратно на вывод в консоль*/
PrintStream console = System.out;
// Присваиваем System.out новое meaning
System.setOut(filePrintStream);
System.out.println("Эта строка будет записана в текстовый файл");
// Возвращаем System.out старое meaning
System.setOut(console);
System.out.println("А эта строка - в консоль!");
}
}
Natijada, birinchi satr matnli faylga yoziladi, ikkinchisi esa konsolga chiqariladi :) Ushbu kodni IDE-ga nusxalashingiz va uni ishga tushirishingiz mumkin. Matn faylini ochib, u erda kerakli qator muvaffaqiyatli yozilganligini ko'rasiz :) Shu bilan ma'ruza yakunlanadi. Bugun biz oqimlar va o'quvchilar bilan qanday ishlashni esladik, ular bir-biridan qanday farq qilishini esladik va System.out
deyarli har bir darsda foydalanadigan yangi xususiyatlarni bilib oldik :) Keyingi ma'ruzalarda ko'rishguncha!
GO TO FULL VERSION