1. InputStreamReader
klase
Ang isa pang kawili-wiling tampok ng mga stream ay na maaari mong pagsamahin ang maramihang mga stream nang magkasama sa mga chain . Ang isang stream ay maaaring magbasa ng data hindi lamang mula sa panloob na pinagmumulan ng data, kundi pati na rin mula sa isa pang stream .
Ito ay isang napakalakas na mekanismo sa Java, na ginagawang posible na lumikha ng mga kumplikadong sitwasyon sa pagbabasa ng data sa pamamagitan ng pagkonekta sa isang stream sa isa pa. Ang ganitong scheme ay ganito ang hitsura:
Kapag ang isang program ay nagbabasa ng data mula sa isang data stream, ang data stream naman ay nagbabasa ng data mula sa data source nito, na isa pang data stream o isang file, halimbawa.
Higit pa rito, ang bawat stream ng data ay hindi lamang nagbabasa at nagbibigay ng data, ngunit maaari din itong baguhin o magsagawa ng iba't ibang mga operasyon dito. Ang isang magandang halimbawa ng naturang "intermediate stream" ay ang InputStreamReader
klase.
Alam na natin ang isang klase na tinatawag na FileReader
— ito ay isang Reader
nagbabasa ng data mula sa isang file. At saan InputStreamReader
kinukuha ang data nito? Tama iyon — mula sa isang InputStream
.
Kapag lumikha ka ng isang InputStreamReader
bagay, kailangan mong ipasa ang isang InputStream
bagay o isa sa mga descendant na klase nito. Halimbawa:
String src = "c:\\projects\\log.txt";
FileInputStream input = new FileInputStream(src);
InputStreamReader reader = new InputStreamReader(input);
Ang InputStreamReader
klase ay may lahat ng mga pamamaraan na Reader
mayroon ang klase, at gumagana ang mga ito sa eksaktong parehong paraan.
Ang pangunahing pagkakaiba sa pagitan ng InputStreamReader
klase at, sabihin nating, FileReader
ay kung saan sila nagbabasa ng data. FileReader
nagbabasa ng data mula sa isang file (duh — kaya nga ito ay tinatawag na FileReader
), ngunit InputStreamReader
nagbabasa ng data mula sa isang InputStream
.
Kapag nagbasa ka ng isang character mula sa isang FileReader
bagay gamit ang read()
pamamaraan, ito naman ay nagbabasa ng dalawang byte mula sa file sa disk at ibinabalik ang mga ito bilang chars
.
Kapag nagbasa ka ng isang character mula sa isang InputStreamReader
bagay gamit ang read()
pamamaraan, ito naman ay nagbabasa ng dalawang byte mula sa FileInputStream
bagay na ipinasa dito, na nagbabasa ng data mula sa file. Ang resulta ay isang hanay ng mga tawag sa read()
mga pamamaraan.
2. BufferedReader
klase
Ang isa pang kawili-wiling klase na malamang na marami kang gagamitin ay BufferedReader
. Isa rin itong "intermediate stream" na nagbabasa ng data mula sa isa pang stream.
Gaya ng ipinahihiwatig ng pangalan nito, ang BufferedReader
klase ay isang subclass ng Reader
at hinahayaan kang magbasa ng mga character . Ngunit ang pinakakawili-wili ay kailangan mo rin itong ipasa ang isang data source sa anyo ng isang stream kung saan mababasa ang mga character , ibig sabihin, isang stream na nagmamana ng Reader
klase.
Ano ang punto? Hindi tulad ng InputStreamReader
, ang BufferedReader
klase ay hindi nagko-convert ng mga byte sa mga character: hindi ito nagko-convert ng kahit ano. Sa halip, nag-buffer ito ng data .
Kapag ang isang programa ay nagbabasa ng isang character mula sa isang BufferedReader
bagay, binabasa ng object ang isang malaking hanay ng mga character mula sa source stream nito nang sabay-sabay. At iniimbak ang mga ito sa loob.
Kapag binasa ang susunod na character mula sa BufferedReader
object, kukunin lang nito ang susunod na character mula sa internal buffer array nito at ibinabalik ito nang hindi ina-access ang data source. Kapag naubos na ang lahat ng mga character sa buffer ay mababasa ito sa isa pang malaking hanay ng mga character.
Ang BufferedReader
klase ay mayroon ding napakakapaki-pakinabang na paraan — String readLine()
, na nagbibigay-daan sa iyong basahin ang buong string ng data mula sa source stream nang sabay-sabay. Maaari mong gamitin ang paraang ito upang, sabihin nating, basahin ang isang file at ipakita ang mga nilalaman nito sa screen nang linya sa linya. Halimbawa:
Partikular kaming nagsulat ng ilang compact code upang ilarawan kung gaano ito kaginhawa. Ang code na ito ay maaari ding isulat na may kaunting detalye.
|
Lumikha ng isang FileReader bagay. Ang data source ay isang file. Lumikha ng isang BufferedReader bagay. Ang data source ay isang FileReader . Hangga't may datos pa sa mambabasa Basahin ang isang linya Ipakita ang linya |
Kung magkaka-chain ka ng maraming stream, kung gayon ang close()
pamamaraan ay kailangan lamang na tawagan sa isa sa mga ito. Ang stream na iyon ay tatawag sa pamamaraan sa pinagmulan ng data nito, at iba pa, hanggang close()
sa tawagin sa huling stream ng data.
3. Pagbabasa mula sa console
At isa pang kawili-wiling katotohanan: ang Scanner
klase ay hindi hihigit sa isang intermediate input stream na nagbabasa ng data mula sa System.in
, na isa ring stream ng data.
Narito ang dalawang paraan upang basahin ang isang linya mula sa console:
Klase ng scanner | BufferedReader at BufferedWriter na mga klase |
---|---|
|
|
Ang aming kaibigan ay walang iba kundi isang static na variable ng klase. Ito ay isang ang pangalan ay .System.in
in
System
InputStream
in
Kaya halos sa simula pa lang ng iyong pag-aaral sa Java sa CodeGym, nagtatrabaho ka na sa mga stream ng data at bumuo ng mga chain mula sa kanila. Ngunit ngayon ay gagawin mo ito nang mas may kamalayan.
GO TO FULL VERSION