CodeGym /Blog Jawa /Acak /Maca saka keyboard: "pembaca"
John Squirrels
tingkat
San Francisco

Maca saka keyboard: "pembaca"

Diterbitake ing grup
Hi! Pawulangan lan tugas ing Level 3 mulang sampeyan carane nampilake barang ing konsol, lan, pindhah menyang arah liyane, carane maca data saka keyboard.
Maca saka keyboard: "pembaca" - 1
Sampeyan malah sinau nggunakake konstruksi kompleks ing ngisor iki kanggo ngrampungake iki:

BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
Nanging ana siji pitakonan sing durung dijawab.

Kepiye carane iki bisa ditindakake?

Ing kasunyatan, program arang banget independen. Dheweke komunikasi karo program, sistem, Internet, lan liya-liyane. Kanthi "komunikasi", utamane tegese "ijol-ijolan data". Yaiku, dheweke nampa sawetara data eksternal lan uga ngirim data program internal nang endi wae. Conto program ijol-ijolan data akeh banget ing urip saben dina. Contone, akeh situs web ngidini sampeyan mlebu nggunakake akun Facebook utawa Twitter tinimbang ndhaptar. Ing kahanan iki, rong program (eg Twitter lan situs web sing sampeyan lebokna) ijol-ijolan data sing dibutuhake. Asil pungkasan yaiku sampeyan wis kasil mlebu. Tembung "stream"dipunginakaken kangge ngandharaken proses pertukaran data. Saka ngendi asale jeneng iki? Ing pengalaman sampeyan, "stream" bisa uga ana hubungane karo kali lan tinimbang karo program. Iku ora Laka :) A stream punika, ing pet, Piece obah saka data. Ing tembung liya, ing pemrograman, dudu banyu sing mili - nanging data kanthi bentuk bita lan karakter. Kita bisa nampa bit data saka aliran data lan banjur digunakake. Maneh, kita bakal nggunakake analogi banyu / aliran: sampeyan bisa njupuk banyu saka kali kanggo nggawe sup, mateni geni, utawa nyirami kembang sampeyan. Aliran ngidini sampeyan nggarap sumber data apa wae: apa Internet, sistem file komputer, utawa liya-liyane - ora ana bedane. Aliran minangka alat universal. Padha ngidini program kanggo nampa data saka ngendi wae (input stream) lan ngirim menyang ngendi wae (output stream). Tugase padha: njupuk data saka sak panggonan lan ngirim menyang liyane. Ana rong jinis aliran:
  1. Aliran input digunakake kanggo nampa data
  2. Aliran output kanggo ngirim data.
Ing Jawa, aliran iki diimplementasikake dening InputStreamlan OutputStreamkelas. Nanging aliran kasebut bisa dikategorikake kanthi cara liya. Saliyane aliran input lan output, kita uga ngomong babagan stream byte lan stream karakter . Makna ing kene kudu cukup cetha: stream byte ngirim informasi minangka sakumpulan bita, nalika stream karakter dikirim minangka sakumpulan karakter. Ing wulangan iki, kita bakal ngrembug babagan aliran input. Aku bakal sijine link karo informasi bab output stream ing mburi pawulangan. Sampeyan bisa maca dhewe :) Saiki deleng kode iki:

BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
Nalika arep sinau, apa sampeyan ora mikir yen baris iki cukup medeni? :) Ora bakal kedadeyan yen kita wis njelajah cara kerjane. Ayo dadi bener. Kita bakal miwiti ing pungkasan. System.iniku InputStreamobyek, Kayata saka kelas kita ngandika bab awal. Iki minangka aliran input sing disambung menyang piranti input sistem (keyboard). Miturut cara, sampeyan ora langsung kenal karo aliran iki. Sawise kabeh, sampeyan kerep nggunakake "rekan kerja" - System.out! System.outpunika stream output sistem . Digunakake kanggo ngasilake data menyang konsol liwat metode favorit System.out.println(), sing sampeyan gunakake terus :) System.outminangka stream kanggo ngirim data menyang konsol, nalikaSystem.iniku kanggo njupuk data saka keyboard. Iku kabeh prasaja :) Apa maneh, kita bisa maca data saka keyboard tanpa mbangun ageng iki. Kita mung bisa nulis: System.in.read();

public class Main {

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

       while (true) {
           int x = System.in.read();
           System.out.println(x);
       }
   }
}
Kelas InputStream(elinga, System.inminangka InputStreamobyek) duwe read()metode sing ngidini sampeyan maca data. Ana siji masalah: maca bita , dudu karakter . Bosen mung nggunakake huruf Inggris, mula ayo nyoba maca karakter Cina "魚" saka keyboard (mung nyalin huruf iki saka kene lan nempel menyang console nggunakake ctrl + v ing PC utawa Command + v ing Mac). Karakter iki tegese 'iwak' kanthi cara. Output konsol: 233 173 154 10 Simbol iki lan akeh wong Tionghoa liyane manggoni 3 bait ing memori komputer (ora kaya huruf Latin, sing mung 1 bait). Ing kasus iki, 4 bait diwaca saka stream: telu pisanan makili karakter "魚", lan bait liyane makili baris anyar (Ketik). Patut, System.ining wangun unadorned ora pilihan kanggo kita. Manungsa (karo pangecualian langka!) Ora ngerti maca bait. Nanging InputStreamReaderkelas teka kanggo ngluwari! Ayo ndeleng kewan apa iki.

BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
We pass System.inmenyang obyek InputStreamReader . Jeneng kelas kasebut! Kita nggawe InputStreamReaderobyek lan pass stream input sing bakal maca data saka. Ing kasus iki...

new InputStreamReader(System.in)
... kita ngomong, "sampeyan bakal maca data saka stream input sistem (saka keyboard)". Nanging iki ora mung fungsi! Ora InputStreamReadermung nampa data saka stream. Iki uga ngowahi stream byte dadi stream karakter . Ing tembung liya, sampeyan ora perlu maneh ngowahi data saka "siji lan nol" menyang "basa sing bisa diwaca manungsa". InputStreamreadernindakake kabeh kanggo sampeyan. Mesthine, InputStreamReaderora diwatesi kanggo maca data saka konsol. Bisa maca data saka panggonan liya uga. Contone, saka 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"));
   }
}
Kene kita nggawe FileInputStream(siji roso saka InputStream), pass ing path file, lan pass stream dhewe menyang InputStreamReader. Saiki bakal bisa maca data saka file (yen file bener ana ing path, mesthi). Kita uga nggunakake metode InputStreamReaderkelas read()kanggo maca data (sumber data ora masalah: konsol, file, utawa ing papan liya). Apa bedane karo System.in.read()? InputStreamReader.read()\ Coba maneh maca aksara "魚" nganggo aksara InputStreamReader. Aku ngelingake sampeyan apa sing sejatine diwaca dening System.in.read(): 233 173 154 10 Lan kepiye carane InputStreamReadernindakake pakaryan sing padha?

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 konsol: 39770 10 Bentenipun langsung katon. Byte pungkasan (makili baris anyar) tetep ora owah (nomer 10), nanging karakter "魚" diowahi dadi kode siji "39770". Iki tegese maca aksara! Yen sampeyan ora percaya yen 39770 nggambarake huruf "魚", gampang banget kanggo ngyakinake dhewe :)
import java.io.IOException;

public class Main {

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

       char x = 39770;
       System.out.println(x);
   }
}
Output konsol: Nanging yen InputStreamReaderpancen apik banget, kenapa kita uga butuh BufferedReader? InputStreamReaderngerti carane maca data lan ngowahi bita dadi karakter. Apa maneh sing bisa dijaluk? Kenapa Reader liyane? :/ Jawaban iki banget prasaja: kanggo kinerja luwih lan penak . Ayo dadi miwiti karo kinerja. Nalika BufferedReadermaca data, nggunakake area khusus sing disebut buffer, ing ngendi "nyimpen" karakter sing diwaca. Pungkasane, nalika karakter kasebut dibutuhake ing program kasebut, bakal dijupuk saka buffer, ora langsung saka sumber data (keyboard, file, lsp.). Iki nyimpen akeh sumber daya. Kanggo ngerti cara kerjane, mbayangno kurir ing perusahaan gedhe. Kurir lungguh ing kantor, ngenteni wong sing nggawa paket kanggo dikirim. Saben entuk paket anyar, dheweke bisa langsung menyang dalan. Nanging bisa uga ana akeh paket sajrone awan. Dheweke kudu nggawe akeh lelungan ing antarane kantor lan alamat pangiriman. Nanging, kurir nyelehake kothak ing kantore. Saben uwong sijine paket ing kothak. Saiki kurir bisa njupuk kothak kanthi tenang lan pindhah saka alamat menyang alamat. Iki ngirit wektu akeh, amarga dheweke ora kudu bali menyang kantor saben wektu. Ing conto iki, kothak mung buffer, lan kantor minangka sumber data. Luwih gampang kanggo kurir njupuk paket saka kothak siji nalika ngirim kiriman tinimbang bali menyang kantor saben wektu. Dheweke uga bakal ngirit bensin. Kajaba iku, ing program iku luwih kurang sumber-intensif kanggo njupuk data saka buffer saka kanggo deleng sumber data saben wektu. Akibate,BufferedReader+ InputStreamReaderluwih cepet tinimbang InputStreamReaderpiyambak . Kita wis nimbang kinerja. Kepiye babagan kepenak? Kauntungan utama yaiku Bufferedreaderbisa maca data ora mung siji karakter sekaligus (sanajan bisa nindakake iki kanthi cara read()), nanging uga kabeh baris sekaligus! Iki ditindakake kanthi nggunakake readLine()metode;

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 konsol: CodeGym minangka situs web sing paling apik kanggo sinau basa Jawa! Kita maca baris iki saka keyboard: CodeGym minangka situs web sing paling apik kanggo sinau basa Jawa! Iki utamané migunani nalika maca jumlah gedhe saka data. Maca siji utawa rong baris karakter teks kanthi karakter isih bisa ditindakake. Nanging maca ing "Perang lan Damai" siji-sijine huruf bakal dadi masalah :)

Wacan liyane:

Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION