JavaRush /Java Blog /Random-TL /Pagbabasa mula sa keyboard - "mga mambabasa"

Pagbabasa mula sa keyboard - "mga mambabasa"

Nai-publish sa grupo
Kamusta! Sa mga lektura at gawain, natutunan namin kung paano mag-output ng data sa console, at kabaliktaran - basahin ang data mula sa keyboard. Pagbasa mula sa keyboard - "mga mambabasa" - 1Natutunan mo pa ring gumamit ng kumplikadong konstruksyon para dito:
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
Ngunit hindi pa rin namin sinasagot ang isang tanong.

Paano ito gumagana?

Sa katunayan, ang anumang programa ay madalas na hindi umiiral sa sarili nitong. Maaari itong makipag-ugnayan sa iba pang mga programa, system, Internet, atbp. Sa salitang "makipag-usap" una sa lahat ay nangangahulugang "palitan ng data". Iyon ay, makatanggap ng ilang data mula sa labas, at, sa kabaligtaran, ipadala ang iyong sariling data sa isang lugar. Mayroong maraming mga halimbawa ng pagpapalitan ng data sa pagitan ng mga programa, kahit na sa pang-araw-araw na buhay. Kaya, sa maraming mga site, sa halip na magparehistro, maaari kang mag-log in gamit ang iyong Facebook o Twitter account. Sa sitwasyong ito, dalawang programa, sabihin, Twitter at ang site kung saan sinusubukan mong magrehistro, palitan ang kinakailangang data sa isa't isa, pagkatapos kung saan makikita mo ang resulta - matagumpay na pahintulot. Ang terminong " daloy " ay kadalasang ginagamit upang ilarawan ang proseso ng pagpapalitan ng data sa programming . Saan nga ba nagmula ang pangalang ito? Ang "Daloy" ay mas nauugnay sa isang ilog o sapa kaysa sa programming. Sa katunayan, hindi ito walang dahilan :) Ang stream ay, sa esensya, isang gumagalaw na piraso ng data. Iyon ay, sa programming, hindi tubig ang "dumaloy" kasama ang stream, ngunit ang data sa anyo ng mga byte at character. Mula sa isang stream ng data, maaari kaming makatanggap ng data sa mga bahagi at gumawa ng isang bagay dito. Muli, gamitin natin ang pagkakatulad na "umaagos ng tubig": maaari kang sumalok ng tubig mula sa isang ilog upang magluto ng sopas, magpatay ng apoy, o magtubig ng mga bulaklak. Gamit ang mga stream, maaari kang magtrabaho sa anumang mapagkukunan ng data: ang Internet, ang file system ng iyong computer, o iba pa - hindi ito mahalaga. Ang mga stream ay isang unibersal na tool. Pinapayagan nila ang programa na makatanggap ng data mula sa kahit saan (mga papasok na stream) at ipadala ito kahit saan (mga papalabas na stream). Ang kanilang gawain ay isa - upang kumuha ng data sa isang lugar at ipadala ito sa isa pa. Ang mga stream ay nahahati sa dalawang uri:
  1. Papasok na stream ( Input ) - ginagamit upang makatanggap ng data
  2. Papalabas na stream ( Output ) - para sa pagpapadala ng data.
Ang papasok na daloy ng data sa Java ay ipinatupad sa klase InputStream, at ang papalabas na daloy ng data sa klase OutputStream. Ngunit may isa pang paraan upang hatiin ang mga thread. Ang mga ito ay nahahati hindi lamang sa papasok at papalabas, kundi pati na rin sa byte at character . Narito ang kahulugan ay malinaw nang walang paliwanag: ang isang byte stream ay nagpapadala ng impormasyon sa anyo ng isang hanay ng mga byte, at ang isang character stream ay nagpapadala ng impormasyon sa anyo ng isang hanay ng mga character. Sa panayam na ito ay tatalakayin natin ang tungkol sa mga papasok na stream. At ilalagay ko ang impormasyon tungkol sa mga papalabas na link sa dulo, at mababasa mo ito mismo :) Kaya, ang aming code:
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
Marahil ay naisip mo habang binabasa ang mga lektura na mukhang nakakatakot? :) Ngunit ito ay hanggang sa malaman natin kung paano gumagana ang bagay na ito. Ayusin natin ngayon! Magsimula tayo sa dulo. System.inay isang bagay ng klase InputStreamna pinag-usapan natin sa simula. Ito ay isang papasok na stream, at ito ay nakatali sa system input device - ang keyboard. Siyanga pala, indirectly familiar ka sa kanya. Pagkatapos ng lahat, madalas mong gamitin ang kanyang "kasamahan" sa iyong trabaho - System.out! - ito ay isang system data outputSystem.out stream , ito ay ginagamit para sa output sa console sa mismong paraan na palagi mong ginagamit :) - isang stream para sa pagpapadala ng data sa console, at - para sa pagtanggap ng data mula sa keyboard. Ito ay simple :) Bukod dito: upang basahin ang data mula sa keyboard, magagawa natin nang wala itong malaking konstruksiyon at isulat lamang: ; 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);
       }
   }
}
Sa klase InputStream(at System.in, hayaan mo akong ipaalala sa iyo, ay isang bagay ng klase InputStream) mayroong isang paraan read()na nagbibigay-daan sa iyo na magbasa ng data. Isang problema: nagbabasa ito ng mga byte , hindi mga character . Subukan nating basahin ang letrang Ruso na "Ya" mula sa keyboard. Output ng console:
Я
208
175
10
Ang mga letrang Ruso ay tumatagal ng 2 byte sa memorya ng computer (hindi tulad ng mga letrang Ingles, na tumatagal ng 1 lamang). Sa kasong ito, 3 byte ang binasa mula sa stream: ang unang dalawa ay kumakatawan sa aming titik na "I", at ang isa pa ay ang line break (Enter). Samakatuwid, ang opsyon na gumamit ng "hubad" System.inay hindi angkop sa amin. Ang mga tao (na may mga bihirang eksepsiyon!) ay hindi makakabasa ng mga byte. Dito tayo tutulong sa susunod na klase - InputStreamReader! Alamin natin kung anong uri ng hayop ito.
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
Dinadaanan namin ang batis System.insa InputStreamReader. Sa pangkalahatan, kung isasalin mo ang pangalan nito sa Russian, ang lahat ay mukhang halata - "tagabasa ng mga papasok na stream". Sa totoo lang, para iyon talaga! Lumilikha kami ng object ng klase InputStreamReaderat ipinapasa ito sa isang papasok na stream kung saan dapat itong magbasa ng data. Sa kasong ito...
new InputStreamReader(System.in)
...sinasabi namin dito: "magbabasa ka ng data mula sa system input stream (keyboard)." Ngunit hindi lamang ito ang function nito! InputStreamReaderhindi lamang tumatanggap ng data mula sa stream. Kino-convert din nito ang mga byte stream sa mga stream ng character . Sa madaling salita, hindi mo na kailangang mag-alala tungkol sa pagsasalin ng nabasang data mula sa wikang "computer" sa wikang "tao" - InputStreamReadergagawin nito ang lahat para sa iyo. InputStreamReader, siyempre, maaaring magbasa ng data hindi lamang mula sa console, kundi pati na rin mula sa iba pang mga lugar. Halimbawa, mula sa file:
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"));
   }
}
Dito lumikha kami ng isang papasok na stream ng data FileInputStream(ito ay isa sa mga varieties InputStream), ipinasa ang path sa file papunta dito, at ipinasa ang stream mismo InputStreamReader'y. Ngayon ay makakapagbasa na ito ng data mula sa file na ito, kung umiiral ang file sa landas na ito, siyempre. Upang magbasa ng data (kahit saan, mula sa console, isang file, o kahit saan), InputStreamReaderginagamit din ng klase ang read(). Ano ang pagkakaiba ng System.in.read()at InputStreamReader.read()? Subukan nating bilangin ang parehong titik na “I” gamit ang InputStreamReader. Paalalahanan kita, ito ang naisip ko System.in.read():
Я
208
175
10
Paano niya magagawa ang parehong trabaho 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);
       }
   }
}
Output ng console:
Я
1071
10
Ang pagkakaiba ay makikita kaagad. Ang huling byte - para sa mga line break - ay nanatiling hindi nagbabago (ang numero 10), ngunit ang binasang titik na "I" ay na-convert sa isang solong code na "1071". Ito ay pagbabasa sa pamamagitan ng mga simbolo! Kung bigla kang hindi naniniwala na ang code 1071 ay nangangahulugang ang titik na "I", madali itong i-verify :)
import java.io.IOException;

public class Main {

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

       char x = 1071;
       System.out.println(x);
   }
}
Output ng console:

Я
Ngunit kung InputStreamReaderito ay napakahusay, bakit kailangan mo ng higit pa BufferedReader? InputStreamReadermaaari bang magbasa ng data at mag-convert ng mga byte sa mga character - ano pa ang kailangan natin? Bakit ibang Reader? :/ Ang sagot ay napakasimple - para sa higit na produktibo at higit na kaginhawahan . Magsimula tayo sa pagganap. Kapag nagbabasa ng data, gumagamit ang BufferedReader ng isang espesyal na lugar - isang buffer, kung saan ito ay "nagdaragdag" ng mga binasang character. Bilang resulta, kapag kailangan namin ang mga character na ito sa programa, kukunin sila mula sa buffer, at hindi direkta mula sa pinagmulan ng data (keyboard, file, atbp.), at nakakatipid ito ng maraming mapagkukunan. Upang maunawaan kung paano ito gumagana, isipin, halimbawa, ang gawain ng isang courier sa isang malaking kumpanya. Ang courier ay nakaupo sa opisina at naghihintay para sa mga parsela na dalhin sa kanya para sa paghahatid. Sa tuwing makakatanggap siya ng bagong parsela, maaari siyang agad na tumama sa kalsada. Ngunit maaaring mayroong maraming mga parsela sa araw, at kailangan niyang maglakbay sa pagitan ng opisina at mga address sa bawat oras. Sa halip, naglagay ang courier ng isang kahon sa opisina kung saan maaaring ilagay ng lahat ang kanilang mga parsela. Ngayon ang courier ay maaaring mahinahon na kunin ang kahon at pumunta sa mga address - makakatipid siya ng maraming oras, dahil hindi na niya kailangang bumalik sa opisina sa bawat oras. Ang kahon sa halimbawang ito ay tiyak na buffer, at ang opisina ang pinagmumulan ng data. Mas madali para sa isang courier na kumuha ng sulat mula sa isang karaniwang kahon kapag inihahatid ito kaysa pumunta sa opisina sa bawat oras. Makakatipid din ito ng gas. Ito ay pareho sa isang programa - mas kaunting mapagkukunan-intensive na kumuha ng data mula sa buffer, sa halip na i-access ang data source sa bawat oras. Iyon ang dahilan kung bakit BufferedReader+ InputStreamReadergumagana nang mas mabilis kaysa sa InputStreamReader. Inayos namin ang pagganap, ngunit paano ang tungkol sa kaginhawahan? Ang pangunahing bentahe ay na BufferedReadermaaari itong magbasa ng data hindi lamang ng isang character sa isang pagkakataon (bagaman read()mayroon din itong paraan para sa layuning ito), kundi pati na rin ang buong mga linya! Ginagawa ito gamit ang 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);
   }
}
Output ng console:
JavaRush is the best site to learn Java!
Мы считали с клавиатуры эту строку:
JavaRush — лучший сайт для изучения Java!
Ito ay lalong kapaki-pakinabang kapag nagbabasa ng malaking halaga ng data. Ang isa o dalawang linya ng teksto ay maaari pa ring basahin ng bawat karakter. Ngunit ang pagbibilang ng "Digmaan at Kapayapaan" ng isang titik sa isang pagkakataon ay medyo magiging problema :) Ngayon ang gawain ng mga thread ay naging mas malinaw sa iyo. Para sa karagdagang pag-aaral, narito ang isang karagdagang mapagkukunan para sa iyo: Dito maaari kang magbasa ng higit pa tungkol sa mga papasok at papalabas na daloy. Pagsusuri ng video BufferedReadermula sa isa sa aming mga mag-aaral. Oo, oo, ang aming mga mag-aaral ay hindi lamang natututo sa kanilang sarili, ngunit nagre-record din ng mga pang-edukasyon na video para sa iba! Huwag kalimutang i-like at mag-subscribe sa aming channel :)
Mas mainam na sanayin ang iyong sarili sa pagbabasa ng opisyal na dokumentasyon mula sa simula ng iyong pag-aaral. Ito ang pangunahing pinagmumulan ng kaalaman tungkol sa wika, at karamihan sa mga sagot ay laging matatagpuan doon.
Mga komento
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION