JavaRush /Java Blogu /Random-AZ /Klaviaturadan oxumaq - "oxucular"

Klaviaturadan oxumaq - "oxucular"

Qrupda dərc edilmişdir
Salam! Mühazirələrdə və tapşırıqlarda məlumatların konsola çıxarılmasını və əksinə - məlumatları klaviaturadan oxumağı öyrəndik. Klaviaturadan oxumaq - “oxucular” - 1Bunun üçün hətta kompleks bir tikinti istifadə etməyi öyrəndiniz:
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
Amma hələ bir suala cavab verməmişik.

Bu hətta necə işləyir?

Əslində, hər hansı bir proqram çox vaxt öz-özünə mövcud deyil. O, digər proqramlar, sistemlər, internet və s. ilə əlaqə saxlaya bilir. “Ünsiyyət qurmaq” sözü ilə biz ilk növbədə “məlumat mübadiləsi”ni nəzərdə tuturuq. Yəni bəzi məlumatları kənardan qəbul edin və əksinə, öz məlumatlarınızı harasa göndərin. Gündəlik həyatda belə proqramlar arasında məlumat mübadiləsinə dair çoxlu nümunələr var. Beləliklə, bir çox saytlarda qeydiyyatdan keçmək əvəzinə Facebook və ya Twitter hesabınızdan istifadə edərək daxil ola bilərsiniz. Bu vəziyyətdə, iki proqram, məsələn, Twitter və qeydiyyatdan keçməyə çalışdığınız sayt, bir-biri ilə lazımi məlumatları mübadiləsi edir, bundan sonra son nəticəni görürsünüz - uğurlu avtorizasiya. “ Axın ” termini çox vaxt proqramlaşdırmada məlumat mübadiləsi prosesini təsvir etmək üçün istifadə olunur . Bu ad haradan gəldi? "Axın" proqramlaşdırmadan daha çox çay və ya axınla əlaqələndirilir. Əslində bu səbəbsiz deyil :) Axın əslində hərəkət edən məlumat parçasıdır. Yəni proqramlaşdırmada axın boyunca "axan" su deyil, bayt və simvol şəklində olan məlumatlardır. Məlumat axınından biz məlumatları hissə-hissə qəbul edə və onunla nəsə edə bilərik. Yenə də “su axan” analogiyasından istifadə edək: şorba bişirmək, yanğın söndürmək və ya çiçəkləri sulamaq üçün çaydan su götürə bilərsiniz. Axınlardan istifadə edərək istənilən məlumat mənbəyi ilə işləyə bilərsiniz: İnternet, kompüterinizin fayl sistemi və ya başqa bir şey - fərqi yoxdur. Axınlar universal vasitədir. Onlar proqrama istənilən yerdən (daxil olan axınlar) məlumat qəbul etməyə və onu istənilən yerə göndərməyə (gedilən axınlar) imkan verir. Onların vəzifəsi birdir - məlumatları bir yerə götürmək və başqa yerə göndərmək. Axınlar iki növə bölünür:
  1. Daxil olan axın ( Giriş ) - məlumatların qəbulu üçün istifadə olunur
  2. Çıxış axını ( Çıxış ) - məlumat göndərmək üçün.
Java-da daxil olan məlumat axını sinifdə InputStream, gedən məlumat axını isə sinifdə həyata keçirilir OutputStream. Ancaq ipləri bölmək üçün başqa bir yol var. Onlar yalnız daxil olan və gedən deyil, həm də baytxarakterə bölünür . Burada məna izah edilmədən aydındır: bayt axını informasiyanı baytlar toplusu şəklində, simvol axını isə simvollar toplusu şəklində ötürür. Bu mühazirədə biz gələn axınlar haqqında ətraflı məlumat verəcəyik. Və mən sonda gedən keçidlər haqqında məlumat əlavə edəcəm və bu barədə özünüz oxuya bilərsiniz :) Beləliklə, kodumuz:
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
Yəqin ki, mühazirələri oxuyarkən bunun olduqca qorxulu göründüyünü düşündün? :) Ancaq bu, yalnız bu şeyin necə işlədiyini anlayana qədər. İndi düzəldək! Sondan başlayaq. əvvəlində haqqında danışdığımız System.insinfin obyektidir . InputStreamBu, daxil olan axındır və sistem daxiletmə cihazına - klaviaturaya bağlıdır. Yeri gəlmişkən, siz onunla dolayısı ilə tanışsınız. Axı siz tez-tez işinizdə onun "həmkarından" istifadə edirsiniz - System.out! - bu sistem məlumatlarının çıxışSystem.out axınıdır , o, daim istifadə etdiyiniz üsulla konsola çıxış üçün istifadə olunur :) - konsola məlumat göndərmək üçün axın və - klaviaturadan məlumat almaq üçün. Çox sadədir :) Üstəlik: məlumatları klaviaturadan oxumaq üçün biz bu böyük konstruksiya olmadan edə bilərik və sadəcə olaraq yaza bilərik: ; System.out.println()System.outSystem.inSystem.in.read()
public class Main {

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

       while (true) {
           int x = System.in.read();
           System.out.println(x);
       }
   }
}
Sinifdə InputStream(və System.insizə xatırlatmaq istərdim ki, sinfin obyektidir ) məlumatları oxumağa imkan verən InputStreambir üsul var . Bir problem: simvolları deyil, baytlarıread() oxuyur . Klaviaturadan rusca “Ya” hərfini oxumağa çalışaq. Konsol çıxışı:
Я
208
175
10
Rus hərfləri kompüterin yaddaşında 2 bayt yer tutur (cəmi 1 bayt yer tutan ingilis hərflərindən fərqli olaraq). Bu halda axından 3 bayt oxundu: ilk ikisi “I” hərfimizi, digəri isə sətir kəsilməsini (Enter) təmsil edir. Buna görə "çılpaq" istifadə etmək seçimi System.inbizə uyğun olmayacaq. İnsanlar (nadir istisnalarla!) baytları oxuya bilmirlər. Növbəti sinifin köməyimizə gəldiyi yer budur InputStreamReader! Bunun hansı heyvan olduğunu anlayaq.
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
Biz axını System.in. InputStreamReaderÜmumiyyətlə, adını rus dilinə tərcümə etsəniz, hər şey aydın görünür - "daxil olan axınların oxucusu". Əslində, bu, məhz bunun üçündür! Biz bir sinif obyekti yaradırıq InputStreamReadervə ona məlumatları oxumalı olan daxil olan axını ötürürük. Bu halda...
new InputStreamReader(System.in)
...biz ona deyirik: “siz sistem giriş axınından (klaviatura) məlumatları oxuyacaqsınız.” Ancaq bu onun yeganə funksiyası deyil! InputStreamReaderyalnız axından məlumatları qəbul etmir. O, həmçinin bayt axınlarını simvol axınlarına çevirir . Başqa sözlə, oxunmuş məlumatları “kompüter” dilindən “insan” dilinə tərcümə etməkdən artıq narahat olmaq lazım deyil – InputStreamReadero, sizin üçün hər şeyi edəcək. InputStreamReader, əlbəttə ki, yalnız konsoldan deyil, digər yerlərdən də məlumatları oxuya bilər. Məsələn, fayldan:
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {

   public static void main(String[] args) throws IOException {
       InputStreamReader inputStreamReader = new InputStreamReader(new FileInputStream("C:\\Users\\username\\Desktop\\testFile.txt"));
   }
}
Burada biz daxil olan məlumat axını yaratdıq FileInputStream(bu növlərdən biridir InputStream), fayla gedən yolu ona keçirdik və axının özünü InputStreamReader'y. İndi o, bu yolda olan fayl varsa, əlbəttə ki, bu fayldan məlumatları oxuya biləcək. Verilənləri oxumaq üçün (haradan, konsoldan, fayldan və ya başqa yerdən asılı olmayaraq) sinif InputStreamReaderhəmçinin read(). System.in.read()ilə arasındakı fərq nədir InputStreamReader.read()? -dən istifadə edərək eyni “I” hərfini saymağa çalışaq InputStreamReader. Xatırladım ki, mən belə düşündüm System.in.read():
Я
208
175
10
Eyni işi necə edə bilər InputStreamReader?
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);
       }
   }
}
Konsol çıxışı:
Я
1071
10
Fərq dərhal görünür. Son bayt - sətir fasilələri üçün - dəyişməz qaldı (10 rəqəmi), lakin oxunan "I" hərfi tək "1071" koduna çevrildi. Bu simvollarla oxunur! Birdən 1071 kodunun "I" hərfini ifadə etdiyinə inanmırsınızsa, bunu yoxlamaq asandır :)
import java.io.IOException;

public class Main {

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

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

Я
Ancaq InputStreamReaderbu qədər yaxşıdırsa, niyə daha çox şeyə ehtiyacınız var BufferedReader? InputStreamReaderhəm məlumatları oxuya, həm də baytları simvollara çevirə bilər - başqa nə lazımdır? Niyə başqa oxucu? :/ Cavab çox sadədir - daha çox məhsuldarlıq və daha çox rahatlıq üçün . Performansdan başlayaq. Məlumatları oxuyarkən BufferedReader xüsusi bir sahədən - oxunan simvolları "əlavə etdiyi" buferdən istifadə edir. Nəticədə, proqramda bu simvollara ehtiyacımız olduqda, onlar birbaşa məlumat mənbəyindən (klaviatura, fayl və s.) deyil, buferdən götürüləcək və bu, çoxlu resurslara qənaət edir. Bunun necə işlədiyini başa düşmək üçün, məsələn, böyük bir şirkətdə kuryerin işini təsəvvür edin. Kuryer ofisdə oturur və bağlamaların çatdırılması üçün ona gətirilməsini gözləyir. Hər dəfə yeni bağlama alanda dərhal yola çıxa bilir. Amma gün ərzində çoxlu bağlamalar ola bilər və o, hər dəfə ofis və ünvanlar arasında səyahət etməli olacaq. Bunun əvəzinə kuryer ofisə hər kəsin bağlamalarını qoya biləcəyi bir qutu qoydu. İndi kuryer sakitcə qutunu götürüb ünvanlara gedə bilər - o, çox vaxta qənaət edəcək, çünki hər dəfə ofisə qayıtmaq məcburiyyətində qalmayacaq. Bu nümunədəki qutu dəqiq olaraq buferdir və ofis məlumat mənbəyidir. Kuryer üçün hər dəfə ofisə getməkdənsə, onu çatdırarkən ümumi qutudan məktub götürmək daha asandır. Həm də qaza qənaət edəcək. Proqramda da eynidir - hər dəfə məlumat mənbəyinə daxil olmaq əvəzinə buferdən məlumat almaq daha az resurs tələb edir. Buna görə BufferedReader+ InputStreamReadersadəcə -dən daha sürətli işləyir InputStreamReader. Performansı sıraladıq, bəs rahatlıq haqqında nə demək olar? Əsas üstünlüyü ondan ibarətdir ki, BufferedReadero, məlumatları bir anda deyil, həm də read()bütün sətirləri oxuya bilər (baxmayaraq ki, bu məqsəd üçün bir üsul da var). Bu istifadə edilir readLine();
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("We read this line from the keyboard:");
       System.out.println(s);
   }
}
Konsol çıxışı:
JavaRush is the best site to learn Java!
Мы считали с клавиатуры эту строку:
JavaRush — лучший сайт для изучения Java!
Bu, böyük miqdarda məlumat oxuyarkən xüsusilə faydalıdır. Bir və ya iki sətir mətni hələ də simvol-xarakter oxumaq olar. Ancaq "Müharibə və Sülh" hərfini bir hərf saymaq bir qədər problemli olacaq :) İndi iplərin işi sizə daha aydın oldu. Əlavə araşdırma üçün sizə əlavə mənbə təqdim edirik: Burada daxil olan və gedən axınlar haqqında ətraflı oxuya bilərsiniz. BufferedReaderTələbələrimizdən birinin video icmalı . Bəli, bəli, tələbələrimiz təkcə özlərini öyrənmir, həm də başqaları üçün maarifləndirici videolar çəkirlər! Bəyənməyi və kanalımıza abunə olmağı unutmayın :)
Təhsilinizin lap əvvəlindən rəsmi sənədləri oxumağa alışmaq daha yaxşıdır. Bu dil haqqında əsas bilik mənbəyidir və cavabların əksəriyyətini həmişə orada tapmaq olar.
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION