JavaRush /Java Blogu /Random-AZ /BufferedReader və InputStreamReader sinifləri ilə işləməy...

BufferedReader və InputStreamReader sinifləri ilə işləməyi məşq edin

Qrupda dərc edilmişdir
Salam! Bugünkü mühazirə iki hissəyə bölünəcək. Daha əvvəl toxunduğumuz bəzi köhnə mövzuları təkrarlayacağıq və bəzi yeni xüsusiyyətlərə baxacağıq :) BuffreredReader və InputStreamReader sinifləri ilə işləməyi məşq edin - 1Birincidən başlayaq. Təkrar öyrənmənin anasıdır :) Siz artıq belə bir sinifdən istifadə etmisiniz BufferedReader. Ümid edirəm ki, bu əmri hələ də unutmamısınız:
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
System.in, InputStreamReader, BufferedReaderDaha ətraflı oxumadan əvvəl, hər bir komponentin ( ) nə üçün cavabdeh olduğunu və nə üçün lazım olduğunu xatırlamağa çalışın . baş verdi? Yoxdursa, narahat olmayın :) Əgər bu vaxta qədər nəyisə unutmusunuzsa, oxuculara həsr olunmuş bu mühazirəni yenidən oxuyun. Onların hər birinin nə edə biləcəyini qısaca xatırlayaq. System.inklaviaturadan məlumatların qəbulu üçün ipdir. Prinsipcə, mətni oxumaq məntiqini həyata keçirmək üçün bizə bir nəfər kifayət edər. Ancaq xatırladığınız kimi, System.insimvolları deyil, yalnız baytları oxuya bilər:
public class Main {

   public static void main(String[] args) throws IOException {

       while (true) {
           int x = System.in.read();
           System.out.println(x);
       }
   }
}
Bu kodu çalıştırsaq və konsola "Y" hərfini daxil etsək, çıxış belə olacaq:

Й
208
153
10
Kiril simvolları yaddaşda 2 bayt tutur, ekranda göstərilir (və 10 rəqəmi sətir kəsilməsinin bayt təmsilidir, yəni Enter düyməsini basmaqla). Baytları oxumaq belə bir zövqdür, ona görə də onu System.intəmiz formada istifadə etmək əlverişsiz olacaq. Hər kəs üçün başa düşülən kiril (yalnız deyil) hərflərini oxumaq üçün InputStreamReadersarğı kimi istifadə edirik:
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);
       }
   }
}
Eyni “Y” hərfini konsola daxil etsək, bu dəfəki nəticə fərqli olacaq:

Й
1049
10
InputStreamReaderiki oxunan baytı (208, 153) tək 1049 rəqəminə çevirdi. Bu simvollarla oxunur. 1049 asanlıqla yoxlana bilən "Y" hərfinə uyğundur:
public class Main {

   public static void main(String[] args) throws IOException {

       char x = 1049;
       System.out.println(x);
   }
}
Konsol çıxışı:

Й
BufferedReaderYaxşı, 'a (və ümumiyyətlə - BufferedAnything) kimi , performansı optimallaşdırmaq üçün buferləşdirilmiş siniflər istifadə olunur. Məlumat mənbəyinə (fayl, konsol, İnternetdəki resurs) daxil olmaq performans baxımından kifayət qədər bahalı əməliyyatdır. Buna görə də, bu cür zənglərin sayını azaltmaq üçün BufferedReaderməlumatları sonradan qəbul edə biləcəyimiz xüsusi buferdə oxuyur və toplayır. Nəticədə məlumat mənbəyinə edilən zənglərin sayı bir neçə dəfə, hətta onlarla dəfə azalır! 'a'nın başqa bir əlavə xüsusiyyəti BufferedReadervə onun müntəzəmdən üstünlüyü, məlumatları fərdi nömrələr kimi deyil, bütün sətirlər kimi oxuyan InputStreamReaderson dərəcə faydalı metoddur . readLine()Bu, əlbəttə ki, məsələn, böyük mətni həyata keçirərkən rahatlıq əlavə edir. Bir sətri oxumaq belə görünür:
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 və InputStreamReader sinifləri ilə işləməyi məşq edin - 2Əlbəttə ki, BufferedReaderbu, çox çevik mexanizmdir və yalnız klaviatura ilə deyil, işləməyə imkan verir. Siz sadəcə olaraq tələb olunan URL-i oxucuya ötürməklə məlumatları, məsələn, birbaşa İnternetdən oxuya bilərsiniz:
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 fayla gedən yolu keçməklə məlumatları oxuya bilərsiniz:
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-un dəyişdirilməsi

İndi gəlin əvvəllər toxunmadığımız bir maraqlı ehtimala baxaq. Yəqin ki, xatırladığınız kimi, Systemsinifdə iki statik sahə var - System.inSystem.out. Bu əkiz qardaşlar iplik sinif obyektləridir. System.in- abstrakt sinif InputStream. Sinif . System.out_ PrintStreamİndi biz konkret olaraq danışacağıq System.out. Sinfin mənbə koduna daxil olsaq System, bunu görəcəyik:
public final class System {

……………...

public final static PrintStream out = null;

  …………

}
Beləliklə, System.outsadəcə adi statik sinif dəyişəniSystem . Bunun heç bir sehri yoxdur :) Dəyişən outsinifə aiddir PrintStream. Maraqlı bir sual var: niyə kodu icra edərkən System.out.println()çıxış başqa yerdə yox, konsolda görünür? Və bunu bir şəkildə dəyişdirmək mümkündürmü? Məsələn, biz konsoldan məlumatları oxumaq və mətn faylına yazmaq istəyirik. Əlavə oxucu və yazıçı dərslərindən istifadə etmədən, sadəcə olaraq istifadə etmədən belə bir məntiqi həyata keçirmək olarmı System.out? Yenə də mümkün qədər :) Və dəyişən System.outdəyişdirici ilə təyin olunsa da final, biz yenə də bunu edə bilərik! BuffreredReader və InputStreamReader sinifləri ilə işləməyi məşq edin - 3Bəs bunun üçün bizə nə lazımdır? BirincisiPrintStream , indiki obyektin əvəzinə yeni bir sinif obyektinə ehtiyacımız var . Standart olaraq sinifdə quraşdırılmış cari obyekt Systembizə uyğun gəlmir: o, konsola işarə edir. Məlumatlarımız üçün "təyinat" olaraq mətn faylını göstərəcək yenisini yaratmalıyıq. İkincisi , dəyişənə yeni dəyər təyin etmək yollarını başa düşməlisiniz System.out. Bunu sadəcə belə edə bilməzsiniz, çünki qeyd olunub final. Sondan başlayaq. Sinif Systemtam olaraq bizə lazım olan metodu ehtiva edir - setOut(). O, bir obyekti giriş kimi qəbul edir PrintStreamvə onu çıxış nöqtəsi kimi təyin edir. Sadəcə bizə lazım olan şey! Yalnız obyekti yaratmaq qalır PrintStream. Bunu etmək də asandır:
PrintStream filePrintStream = new PrintStream(new File("C:\\Users\\Username\\Desktop\\test.txt"));
Bütün kod belə görünəcək:
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("А эта строка - в консоль!");
   }
}
Nəticədə birinci sətir mətn faylına yazılacaq, ikincisi isə konsola çıxacaq :) Bu kodu IDE-yə köçürə və işlədə bilərsiniz. Mətn faylını açmaqla siz orada lazımi sətirin uğurla yazıldığını görəcəksiniz :) Bununla da mühazirəyə yekun vurulur. Bu gün biz axınlar və oxucularla necə işləməyi xatırladıq, onların bir-birindən necə fərqləndiyini xatırladıq və demək olar ki, System.outhər dərsdə istifadə etdiyimiz yeni funksiyaları öyrəndik :) Növbəti mühazirələrdə görüşənədək!
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION