JavaRush /Java Blog /Random-TL /Magsanay sa pagtatrabaho sa mga klase ng BufferedReader a...

Magsanay sa pagtatrabaho sa mga klase ng BufferedReader at InputStreamReader

Nai-publish sa grupo
Kamusta! Ang lecture ngayon ay hahatiin sa dalawang bahagi. Uulitin natin ang ilan sa mga lumang paksa na nahawakan na natin noon, at titingnan ang ilang mga bagong feature :) Magsanay sa pagtatrabaho sa mga klase ng BuffreredReader at InputStreamReader - 1Magsimula tayo sa una. Ang pag-uulit ay ang ina ng pag-aaral :) Nakagamit ka na ng klase tulad ng BufferedReader. Sana ay hindi mo pa nakalimutan ang utos na ito:
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
Bago magbasa nang higit pa, subukang alalahanin kung ano System.in, InputStreamReader, BufferedReaderang responsibilidad ng bawat bahagi ( ) at kung ano ang kailangan ng mga ito. Nangyari? Kung hindi, huwag mag-alala :) Kung sa puntong ito ay may nakalimutan ka, muling basahin ang lecture na ito na nakatuon sa mga mambabasa muli. Alalahanin natin sandali kung ano ang magagawa ng bawat isa sa kanila. System.inay isang thread para sa pagtanggap ng data mula sa keyboard. Sa prinsipyo, upang ipatupad ang lohika ng pagbabasa ng teksto, ang isa ay magiging sapat para sa amin. Ngunit, gaya ng naaalala mo, System.inmaaari lamang itong 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 patakbuhin natin ang code na ito at ilagay ang letrang "Y" sa console, ang output ay magiging ganito:

Й
208
153
10
Ang mga cyrillic na character ay sumasakop ng 2 byte sa memorya, na ipinapakita sa screen (at ang numero 10 ay ang byte na representasyon ng isang line break, i.e. pagpindot sa Enter). Ang pagbabasa ng mga byte ay isang kasiyahan, kaya ang paggamit nito System.insa dalisay nitong anyo ay magiging abala. Upang mabasa ang Cyrillic (at hindi lamang) mga titik na naiintindihan ng lahat, 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);
       }
   }
}
Kung ilalagay namin ang parehong titik na "Y" sa console, ang resulta sa oras na ito ay magiging iba:

Й
1049
10
InputStreamReaderna-convert ang dalawang read byte (208, 153) sa isang solong numero na 1049. Ito ay binabasa ng mga character. Ang 1049 ay tumutugma sa titik na "Y", na madaling ma-verify:
public class Main {

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

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

Й
Well, tulad ng para sa BufferedReader'a (at sa pangkalahatan - BufferedAnything), ang mga buffered na klase ay ginagamit upang i-optimize ang pagganap. Ang pag-access sa isang mapagkukunan ng data (file, console, mapagkukunan sa Internet) ay isang medyo mahal na operasyon sa mga tuntunin ng pagganap. Samakatuwid, upang mabawasan ang bilang ng mga naturang tawag, BufferedReaderito ay nagbabasa at nag-iipon ng data sa isang espesyal na buffer, mula sa kung saan natin ito matatanggap sa ibang pagkakataon. Bilang resulta, ang bilang ng mga tawag sa pinagmumulan ng data ay nababawasan ng ilang beses o kahit sampu-sampung beses! Ang isa pang karagdagang tampok ng BufferedReader'a at ang kalamangan nito sa regular InputStreamReader' ay ang lubhang kapaki-pakinabang na paraan readLine()na nagbabasa ng data bilang mga buong string sa halip na bilang mga indibidwal na numero. Ito, siyempre, ay lubos na nagdaragdag ng kaginhawahan kapag nagpapatupad, halimbawa, malaking teksto. Ito ang magiging hitsura ng pagbabasa ng isang linya:
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("Пользователь ввел следующий текст:");
       System.out.println(s);
       reader.close();
   }
}

BufferedReader+InputStreamReader работает быстрее, чем просто InputStreamReader
Пользователь ввел следующий текст:
BufferedReader+InputStreamReader работает быстрее, чем просто InputStreamReader
Magsanay sa pagtatrabaho sa mga klase ng BuffreredReader at InputStreamReader - 2Siyempre, BufferedReaderito ay isang napaka-kakayahang umangkop na mekanismo at nagbibigay-daan sa iyo upang gumana hindi lamang sa keyboard. Maaari kang magbasa ng data, halimbawa, nang direkta mula sa Internet sa pamamagitan lamang ng pagpasa ng kinakailangang URL sa 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 kang magbasa ng data mula sa isang file sa pamamagitan ng pagpasa sa path dito:
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();
   }
}

Pagpapalit ng System.out

Ngayon tingnan natin ang isang kawili-wiling posibilidad na hindi pa natin nahawakan noon. Tulad ng malamang na natatandaan mo, Systemmayroong dalawang static na field sa klase - System.inat System.out. Ang mga kambal na kapatid na ito ay mga bagay sa klase ng thread. System.in- abstract na klase InputStream. Klase . System.out_ PrintStreamNgayon ay partikular na pag-uusapan natin ang tungkol sa System.out. Kung pupunta tayo sa source code ng class System, makikita natin ito:
public final class System {

……………...

public final static PrintStream out = null;

  …………

}
Kaya, System.outisang regular na static class variable langSystem . Walang magic dito :) Ang variable outay kabilang sa klase PrintStream. Narito ang isang kawili-wiling tanong: bakit, kapag nagpapatupad ng code, System.out.println()ang output ba ay lalabas sa console at hindi sa ibang lugar? At posible bang baguhin ito kahit papaano? Halimbawa, gusto naming basahin ang data mula sa console at isulat ito sa isang text file. Posible bang ipatupad ang gayong lohika nang hindi gumagamit ng karagdagang mga klase ng mambabasa at manunulat, ngunit ginagamit lamang ang System.out? Hangga't maaari :) At kahit na ang variable System.outay itinalaga ng isang modifier final, magagawa pa rin natin ito! Magsanay sa pagtatrabaho sa mga klase ng BuffreredReader at InputStreamReader - 3Kaya ano ang kailangan natin para dito? Una , kailangan namin ng bagong object ng klase PrintStreamsa halip na ang kasalukuyang. Ang kasalukuyang bagay na naka-install sa klase Systembilang default ay hindi angkop sa amin: tumuturo ito sa console. Kailangan naming gumawa ng bago na magtuturo sa isang text file bilang "destinasyon" para sa aming data. Pangalawa , kailangan mong maunawaan kung paano magtalaga ng bagong halaga sa isang variable System.out. Hindi mo basta-basta magagawa iyon, dahil may marka ito final. Magsimula tayo sa dulo. Ang klase Systemay naglalaman ng eksaktong paraan na kailangan namin - setOut(). Ito ay tumatagal ng isang bagay bilang input PrintStreamat itinatakda ito bilang output point. Ang kailangan lang natin! Ang natitira na lang ay likhain ang bagay PrintStream. Madali din itong gawin:
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"));

       /*Сохраним текущее meaning System.out в отдельную переменную, чтобы потом
       можно было переключиться обратно на вывод в консоль*/
       PrintStream console = System.out;

       // Присваиваем System.out новое meaning
       System.setOut(filePrintStream);
       System.out.println("Эта строка будет записана в текстовый файл");

       // Возвращаем System.out старое meaning
       System.setOut(console);
       System.out.println("А эта строка - в консоль!");
   }
}
Bilang resulta, ang unang linya ay isusulat sa isang text file, at ang pangalawa ay magiging output sa console :) Maaari mong kopyahin ang code na ito sa iyong IDE at patakbuhin ito. Sa pamamagitan ng pagbubukas ng text file, makikita mo na ang kinakailangang linya ay matagumpay na naisulat doon :) Ito ay nagtatapos sa panayam. Ngayon naalala namin kung paano magtrabaho kasama ang mga stream at mga mambabasa, naalala kung paano sila naiiba sa isa't isa at natutunan ang tungkol sa mga bagong tampok System.outna ginamit namin sa halos bawat aralin :) Magkita-kita tayo sa susunod na mga lektura!
Mga komento
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION