1. InputStreamReaderklase

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:

InputStreamReader klase

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 InputStreamReaderklase.

Alam na natin ang isang klase na tinatawag na FileReader— ito ay isang Readernagbabasa ng data mula sa isang file. At saan InputStreamReaderkinukuha ang data nito? Tama iyon — mula sa isang InputStream.

Kapag lumikha ka ng isang InputStreamReaderbagay, kailangan mong ipasa ang isang InputStreambagay 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 InputStreamReaderklase ay may lahat ng mga pamamaraan na Readermayroon ang klase, at gumagana ang mga ito sa eksaktong parehong paraan.

Ang pangunahing pagkakaiba sa pagitan ng InputStreamReaderklase at, sabihin nating, FileReaderay kung saan sila nagbabasa ng data. FileReadernagbabasa ng data mula sa isang file (duh — kaya nga ito ay tinatawag na FileReader), ngunit InputStreamReadernagbabasa ng data mula sa isang InputStream.

Kapag nagbasa ka ng isang character mula sa isang FileReaderbagay 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 InputStreamReaderbagay gamit ang read()pamamaraan, ito naman ay nagbabasa ng dalawang byte mula sa FileInputStreambagay na ipinasa dito, na nagbabasa ng data mula sa file. Ang resulta ay isang hanay ng mga tawag sa read()mga pamamaraan.


2. BufferedReaderklase

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 BufferedReaderklase ay isang subclass ng Readerat 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 Readerklase.

Ano ang punto? Hindi tulad ng InputStreamReader, ang BufferedReaderklase 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 BufferedReaderbagay, 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 BufferedReaderobject, 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 BufferedReaderklase 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.

String src = "c:\\projects\\log.txt";

try(FileReader in = new FileReader(src);
BufferedReader reader = new BufferedReader(in))
{
   while (reader.ready())
   {
      String line = reader.readLine();
      System.out.println(line);
   }
}
Lumikha ng isang FileReaderbagay. Ang data source ay isang file.
Lumikha ng isang BufferedReaderbagay. Ang data source ay isang FileReader.
Hangga't may datos pa sa mambabasa
Basahin ang isang linya
Ipakita ang linya
Isang mahalagang punto:

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 Scannerklase 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
InputStream stream = System.in;
Scanner console = new Scanner(stream);
String line = console.nextLine();
InputStream stream = System.in;
InputStreamReader reader = new InputStreamReader(stream);
BufferedReader buff = new BufferedReader(reader);
String line = buff.readLine();

Ang aming kaibigan ay walang iba kundi isang static na variable ng klase. Ito ay isang ang pangalan ay .System.ininSystemInputStreamin

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.