JavaRush /Java blogi /Random-UZ /BufferedReader va InputStreamReader sinflari bilan ishlas...

BufferedReader va InputStreamReader sinflari bilan ishlashni mashq qiling

Guruhda nashr etilgan
Salom! Bugungi ma'ruza ikki qismga bo'linadi. Biz avvalroq to'xtalib o'tgan eski mavzularni takrorlaymiz va yangi xususiyatlarni ko'rib chiqamiz :) BuffreredReader va InputStreamReader sinflari bilan ishlashni mashq qiling - 1Birinchisidan 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, BufferedReaderKeyinchalik 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.inklaviaturadan ma'lumotlarni qabul qilish uchun ipdir. Aslida, matnni o'qish mantiqini amalga oshirish uchun bizga bittasi kifoya qiladi. Ammo, siz eslayotganingizdek, System.inu 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.insof shaklda ishlatish noqulay bo'ladi. Hamma uchun tushunarli bo'lgan kirill (va nafaqat) harflarni o'qish uchun biz InputStreamReadero'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
InputStreamReaderikkita 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:

Й
BufferedReaderXo'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 BufferedReaderu 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 BufferedReaderva uning odatdagidan ustunligi - bu ma'lumotlarni alohida raqamlar sifatida emas, balki butun satrlar sifatida o'qiydigan InputStreamReaderjuda 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
BuffreredReader va InputStreamReader sinflari bilan ishlashni mashq qiling - 2Albatta, BufferedReaderbu 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, Systemsinfda ikkita statik maydon mavjud - System.inva 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.outoddiy statik sinf o'zgaruvchisiSystem . Unda sehr yo'q :) O'zgaruvchi outsinfga 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.outmodifikator tomonidan belgilangan bo'lsa ham final, biz buni baribir qila olamiz! BuffreredReader va InputStreamReader sinflari bilan ishlashni mashq qiling - 3Xo'sh, buning uchun bizga nima kerak? BirinchidanPrintStream , bizga joriy ob'ekt o'rniga yangi sinf ob'ekti kerak . Sinfda Systemsukut 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 Systembizga kerak bo'lgan usulni o'z ichiga oladi - setOut(). U ob'ektni kirish sifatida qabul qiladi PrintStreamva 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.outdeyarli har bir darsda foydalanadigan yangi xususiyatlarni bilib oldik :) Keyingi ma'ruzalarda ko'rishguncha!
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION