CodeGym/Java Blog/Random/Magsanay sa pagtatrabaho sa mga klase ng BuffreredReader ...
John Squirrels
Antas
San Francisco

Magsanay sa pagtatrabaho sa mga klase ng BuffreredReader at InputStreamReader

Nai-publish sa grupo
Hi! Ang aralin ngayon ay hahatiin sa dalawang bahagi para sa kaginhawahan. Uulitin namin ang ilang mga lumang paksa na nabanggit namin dati, at isasaalang-alang namin ang ilang mga bagong feature :) Magsimula tayo sa una. May klase ka na nang BufferedReadermaraming beses. Sana hindi ka nagkaroon ng panahon para kalimutan ang pahayag na ito:
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
Bago magbasa nang higit pa, subukang tandaan kung ano ang pananagutan ng bawat bahagi — System.in, InputStreamReader, BufferedReader— at kung bakit ito kinakailangan. Naalala mo ba? Kung hindi, no worries. :) Kung may nakalimutan ka, basahin muli ang araling ito , na nakatuon sa mga klase ng mambabasa. Dagli nating aalalahanin kung ano ang magagawa ng bawat isa sa kanila. System.in— ito ay isang stream para sa pagtanggap ng data mula sa keyboard.  Sa prinsipyo, ito lamang ay sapat na upang ipatupad ang lohika na kinakailangan upang basahin ang teksto. Ngunit, tulad ng maaalala mo, System.inmaaari lamang magbasa ng mga byte, hindi mga character:
public class Main {

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

       while (true) {
           int x = System.in.read();
           System.out.println(x);
       }
   }
}
Kung ipapatupad natin ang code na ito at ipasok ang letrang Cyrillic na "Й", ang magiging output ay:
Й
208
153
10
Ang mga cyrillic na character ay sumasakop ng 2 byte sa memorya, at ang mga ito ay ipinapakita sa screen. Ang numero 10 ay ang decimal na representasyon ng isang line feed character, ibig sabihin, mula sa pagpindot sa Enter. Ang pagbabasa ng mga byte ay isang kasiyahan, kaya ang paggamit System.inay hindi masyadong maginhawa. Upang mabasa nang tama ang mga Cyrillic (at iba pa) na mga titik, ginagamit namin InputStreamReaderbilang isang wrapper:
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);
       }
   }
}
Ipinasok namin ang parehong titik na "Й", ngunit ang resulta ay iba sa oras na ito:
Й
1049
10
InputStreamReadernag-convert ng dalawang byte (208 at 153) sa iisang numero na 1049. Ito ang ibig sabihin ng pagbabasa ng mga character. 1049 ay tumutugma sa Cyrillic letter na "Й". Madali nating makumbinsi ang ating sarili na ito ay totoo:
public class Main {

   public static void main(String[] args) throws IOException {
       char x = 1049;
       System.out.println(x);
   }
}
Output ng console:
Й
At bilang forBufferedReader(at sa pangkalahatan, BufferedAnythingYouWant), ang mga buffered na klase ay ginagamit upang i-optimize ang pagganap. Ang pag-access sa isang data source (file, console, web resource) ay medyo mahal sa mga tuntunin ng pagganap. Samakatuwid, upang mabawasan ang bilang ng mga pag-access, BufferedReadernagbabasa at nag-iipon ng data sa isang espesyal na buffer, at nakuha namin ito mula doon. Bilang resulta, ang dami ng beses na na-access ang data source ay nababawasan — posibleng sa ilang mga order ng magnitude! Ang isa pang BufferedReadertampok ng 's at ang kalamangan nito sa karaniwan InputStreamReader, ay ang lubhang kapaki-pakinabang readLine()na pamamaraan, na nagbabasa ng buong linya ng data, hindi mga indibidwal na numero. Ito, siyempre, ay sobrang maginhawa kapag nakikitungo sa malalaking teksto. Narito ang hitsura ng mga linya ng pagbabasa:
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 ("The user entered the following text:");
       System.out.println(s);
       reader.close();
   }
}
BufferedReader+InputStreamReader is faster than InputStreamReader alone
The user entered the following text:
BufferedReader+InputStreamReader is faster than InputStreamReader alone
Magsanay sa pagtatrabaho sa mga klase ng BuffreredReader at InputStreamReader - 2Siyempre, BufferedReadernapaka-flexible. Hindi ka limitado sa pagtatrabaho gamit ang keyboard. Halimbawa, maaari mong basahin ang data nang direkta mula sa web, sa pamamagitan lamang ng pagpasa ng kinakailangang URL sa isang mambabasa:
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();
   }
}
Maaari mong basahin ang data mula sa isang file sa pamamagitan ng pagpasa sa path ng file:
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();
   }
}

Pinapalitan ang System.out

Ngayon tingnan natin ang isang kawili-wiling kakayahan na hindi pa natin nahawakan noon. Tulad ng tiyak mong natatandaan, ang Systemklase ay may dalawang static na field — System.inat  System.out. Ang mga kambal na kapatid na ito ay mga stream object. System.inay isang InputStream. At System.out ay isang PrintStream. Sa ngayon, pag-uusapan natin  System.out. Kung bumaba tayo sa Systemsource code ng klase, makikita natin ito:
public final class System {
……………...
public final static PrintStream out = null;
 …………
}
Kaya,  System.out  ito ay isang ordinaryong static na variable ngSystem klase. Walang magic tungkol dito :) Ang outvariable ay isang PrintStreamsanggunian. Narito ang isang kawili-wiling tanong: Kailan System.out.println()naisakatuparan, bakit eksaktong napupunta ang output sa console at hindi sa ibang lugar? At maaari ba itong baguhin kahit papaano? Halimbawa, ipagpalagay na gusto naming basahin ang data mula sa console at isulat ito sa isang text file. Posible bang ipatupad ito sa simpleng paggamit  System.outsa halip na mga karagdagang klase ng mambabasa at manunulat? Sa katunayan, ito ay :) At magagawa natin ito kahit na ang System.outvariable ay minarkahan ng finalmodifier!  Magsanay sa pagtatrabaho sa mga klase ng BuffreredReader at InputStreamReader - 3Kaya ano ang kailangan natin para mangyari ito? Una sa lahat, kailangan namin ng isang bagong PrintStreambagay upang palitan ang kasalukuyan. Ang kasalukuyang bagay, itinakda saSystemclass bilang default, ay hindi nagsisilbi sa aming mga layunin: tumuturo ito sa console. Kailangan mong gumawa ng bago na tumuturo sa isang text file — ang "destinasyon" para sa aming data. Pangalawa, kailangan nating maunawaan kung paano magtalaga ng bagong halaga sa System.outvariable. Hindi ka maaaring gumamit ng isang simpleng operator ng pagtatalaga, dahil ang variable ay minarkahan final. Magtrabaho tayo pabalik mula sa dulo. Habang nangyayari ito, ang Systemklase ay mayroong pamamaraang kailangan natin: setOut(). Ito ay tumatagal ng isang PrintStreambagay at itinakda ito bilang ang destinasyon para sa output. Iyon lang ang kailangan natin! Ang natitira na lang ay lumikha ng isang PrintStreambagay. Ito ay madali din:
PrintStream filePrintStream = new PrintStream(new File("C:\\Users\\Username\\Desktop\\test.txt"));
Ang buong code ay magiging ganito:
public class SystemRedirectService {

   public static void main(String arr[]) throws FileNotFoundException
   {
       PrintStream filePrintStream = new PrintStream(new File("C:\\Users\\Username\\Desktop\\test.txt"));
       /* Save the current value of System.out in a separate variable so that later
       we can switch back to console output */

       PrintStream console = System.out;
       // Assign a new value to System.out
       System.setOut(filePrintStream);
       System.out.println("This line will be written to the text file");

       // Restore the old value of System.out
       System.setOut(console);
       System.out.println("But this line will be output to the console!");
   }
}
Bilang resulta, ang unang string ay nakasulat sa text file, at ang pangalawa ay ipinapakita sa console :) Maaari mong kopyahin ang code na ito sa iyong IDE at patakbuhin ito. Buksan ang text file at makikita mo na ang string ay matagumpay na naisulat doon :) Sa pamamagitan nito, natapos na ang ating aralin. Ngayon ay naalala namin kung paano magtrabaho kasama ang mga stream at mga mambabasa. Naalala namin kung paano sila naiiba sa isa't isa at nalaman namin ang tungkol sa ilang mga bagong kakayahan ng System.out, na ginamit namin sa halos bawat aralin :) Hanggang sa susunod na mga aralin!

Higit pang pagbabasa:

Mga komento
  • Sikat
  • Bago
  • Luma
Dapat kang naka-sign in upang mag-iwan ng komento
Wala pang komento ang page na ito