Programmēšana

Java 101: Standarta ievades / izvades mīnusi

Iepriekš Java 101 rakstos es atsaucos uz novirzīšanas, standarta ievades ierīces un standarta izvades ierīces jēdzieniem. Lai parādītu datu ievadi, tika izsaukti vairāki piemēri System.in.read (). Izrādās, ka tā System.in.read () ievada datus no standarta ievades ierīces. Lai parādītu datu iznākšanu, tika izmantoti piemēri System.out.print () un System.out.println (). Pretstatā System.in.read (), tie metodes - nosauktās izpildāmā koda sekvences (kas jāizpēta nākamā mēneša rakstā) - nosūta to izvadi uz standarta izvades ierīci. Vai vēlaties uzzināt vairāk par standarta I / O koncepcijām? Turpini lasīt!

Standarta I / O ir standartizēts ievades / izvades mehānisms, kura izcelsme ir operētājsistēma Unix. Lai gan šo mehānismu galvenokārt izmanto vecākās operētājsistēmās, kas nav GUI, standarta I / O joprojām ir nozīme mūsdienu GUI (grafiskā lietotāja saskarne) operētājsistēmās, kur cilvēki to izmanto, lai atkļūdotu nepareizi funkcionējošas programmas un iemācītu ievadi / izvadi ievadot līmeņa programmēšanas kursi.

Kā jūs droši vien uzminējāt, standarta I / O datu ievadei un izvadei tiek izmantotas ierīces. Šīs ierīces ietver standarta ieeju, standarta izvadi un standarta kļūdas.

Standarta ievade

The standarta ievades ierīce ir tā operētājsistēmas daļa, kas kontrolē vietu, kur programma saņem savu ieguldījumu. Pēc noklusējuma standarta ievades ierīce nolasa šo ievadi no tastatūrai pievienotā ierīces draivera. Tomēr jūs varat novirzīt, vai pārslēdziet, ievades avotu ierīces draiverim, kas pievienots failam, lai šķiet, ka ievads "maģiski" nāk no faila, nevis tastatūras.

Programma ievada savus datus no standarta ievades ierīces, izsaucot Java System.in.read () metodi. Ieskatieties SDK dokumentācijā, un jūs atradīsit klasi, ko sauc Sistēma. Šajā klasē ir mainīgais, ko sauc iekšā - objekts, kas izveidots no InputStream. Perioda raksturs pēc Sistēma nosaka, ka iekšā pieder Sistēmaun perioda raksturs pēc iekšā nosaka, ka lasīt () pieder iekšā. Citiem vārdiem sakot, lasīt () ir metode, kas pieder objektam, ko sauc iekšā, kas savukārt pieder klasei, ko sauc Sistēma. (Nākamajā mēnesī es vairāk apspriedīšu par klasēm, priekšmetiem un “piederību”.)

System.in.read () neņem argumentus un atgriež veselu skaitli, kas dažus no tiem ir licis uzskatīt System.in.read () atgriež lietotāja ievadītos veselos skaitļus. Lai precizētu, System.in.read () vai nu atgriež atslēgas 7 bitu ASCII kodu (ja standarta ievades ierīcei ir iestatīta tastatūra), vai 8 bitu baitu no faila (ja standarta ievades ierīce ir novirzīta no tastatūras uz failu). Jebkurā gadījumā System.in.read () pārveido kodu par 32 bitu veselu skaitli un atgriež rezultātu.

Pieņemsim, ka standarta ievades ierīce ir iestatīta uz tastatūru. Tālāk ir aprakstīts, kas notiek operētājsistēmā Windows: ierakstot atslēgu Windows kontrolētā tastatūrā, operētājsistēma glabā šīs atslēgas 7 bitu ASCII kodu iekšējā atslēgu buferī. Šajā atslēgas buferī ir aptuveni 16 ASCII kodi, un tas ir organizēts kā pirmās rindas / pirmās ārējās apļveida rindas datu struktūra. System.in.read () izgūst ASCII kodu no atslēgas bufera galvas un pēc tam noņem šo kodu no atslēgas bufera. Šis 7 bitu ASCII kods pēc tam tiek pārveidots par int - pēc System.in.read () sagatavojot kodam 25 nulles bitus - un atgriežas pie metodes zvanītāja. Sekunde System.in.read () method call izgūst nākamo ASCII kodu, kas tagad atrodas atslēgu bufera galvgalī utt.

Pieņemsim, ka atslēgu buferī nav ASCII kodu. Kas notiek? System.in.read () gaida, kamēr lietotājs ievadīs atslēgas un nospiedīs terminatoru. Operētājsistēmā Windows šis terminators ir Enter taustiņu. Spiešana Enter liek Windows saglabāt atslēgas buferī pārvadājuma atgriešanās kodu (ASCII 13), kam seko jaunas rindas kods (ASCII 10). Tāpēc atslēgu buferī varētu būt vairāki ASCII kodi, kam seko karietes atgriešanās un jaunas rindas raksturs. Pirmais no šiem kodiem atgriežas no System.in.read (). Pārbaudiet šo darbību, ievadot, apkopojot un palaižot Atbalss pieteikums; tā pirmkods parādās 1. sarakstā.

Uzskaitīšana 1. Echo.java

// Echo.java klase Echo {public static void main (String [] args) throws java.io.IOException {int ch; System.out.print ("Ievadiet tekstu:"); kamēr ((ch = System.in.read ())! = '\ n') System.out.print ((char) ch); }} 

Atbalss veic šādas darbības:

  1. Zvana System.out.print () metodi, kurai nepieciešama a Stīga arguments, lai izdotu uzvedni
  2. Zvani System.in.read () lai ievadītu ASCII kodus no standarta ievades ierīces kā 32 bitu veselus skaitļus
  3. Pārvērš šos 32 bitu veselos skaitļus par 16 bitu Unicode rakstzīmēm, izmantojot (char) cast
  4. Zvana System.out.print () metode, kas prasa a char arguments, lai atbalsotu šīs Unicode rakstzīmes standarta izvades ierīcē

Iepriekšējo četru darbību pēdējie trīs soļi notiek īsā laikā un turpinās, līdz tiek nolasīts jaunas rindas raksturs. Skriet Atbalss lai ievadītu no tastatūras un izvada uz ekrānu, izsniedziet šādu komandrindu: java Eho.

Lai gan System.in.read () nekad neizmet izņēmumu (skat. šī raksta vārdu skaitīšanas tēmu, lai definētu šo terminu). Ja standarta ievades ierīce ir iestatīta uz tastatūru, tā var mest izņēmumu, kad standarta ievades ierīci novirzāt no tastatūras uz citu failu. Piemēram, pieņemsim, ka standarta ievades ierīci novirzāt uz failu un System.in.read () lasa saturu no faila. Tagad pieņemsim, ka fails atrodas disketē un lietotājs izstumj disku lasīšanas darbības laikā. Kad izgrūšana notiek, System.in.read () izmet izņēmumu, informējot programmu, ka tā nevar lasīt failu. Tas norāda iemeslu met java.io.IOException klauzula galvenais () metodes galvene. (Nākamajā rakstā jūs izpētīsit izņēmumus, izņēmumus un saistītos jēdzienus.)

Kā jūs novirzāt standarta ievades ierīci tā, lai ievade būtu no faila? Atbilde ir ieviest mazāk nekā zīmi, <, komandrindā un sekojiet šim simbolam ar faila nosaukumu. Lai uzzinātu, kā tas darbojas, izsniedziet šādu komandrindu: java Eho <>. Komandrinda novirza standarta ievades ierīci uz failu ar nosaukumu Eho.java. Kad Atbalss darbojas, jo katra rinda beidzas ar jaunu rindiņu, tikai pirmā teksta rindiņa Eho.java parādās ekrānā.

Pieņemsim, ka jums ir nepieciešama utilītprogramma, kas nolasa visu failu un ekrānā parāda faila saturu, kopē šo saturu citā failā vai kopē šo saturu printerī. Diemžēl Atbalss programma veic šo uzdevumu tikai līdz brīdim, kad tā sastop pirmo pirmo rindiņu. Ar ko tu nodarbojies? Atbilde uz problēmu slēpjas Tips pieteikumu. 2. sarakstā ir norādīts avota kods:

Saraksts 2. tips.java

// Type.java class Type {public static void main (String [] args) throws java.io.IOException {int ch; kamēr ((ch = System.in.read ())! = -1) System.out.print ((char) ch); }} 

Tips atgādina Atbalsstomēr nav ātras norādes, un kamēr cikls pārbauda pret -1 (kas norāda faila beigas), nevis \ n (kas norāda rindas beigas). Skriet Tips, izsniedziet šādu komandrindu: java tips <>. Programmas saturs Tips.java - vai kāds fails ir norādīts - parādīsies. Kā eksperimentu mēģiniet norādīt java tips. Kā jūs domājat, kas notiks? (Padoms: šī programma atgādina Atbalss bet nebeidzas, kamēr nenospiežat Ctrl + C.)

Iepriekš es minēju, ka daži programmētāji to kļūdaini domā System.in.read () atgriež lietotāja ievadīto numuru. Kā jūs tikko redzējāt, tas tā nav. Bet kas jums jādara, ja vēlaties izmantot System.in.read () lai izgūtu numuru? Apskatiet Pārvērst lietojumprogramma, kuras pirmkods ir parādīts 3. sarakstā.

Saraksts 3. Convert.java

// Convert.java klase Convert {public static void main (String [] args) throws java.io.IOException {System.out.print ("Lūdzu, ievadiet numuru:"); int num = 0; int ch; while ((ch = System.in.read ())! = '\ n') if (ch> = '0' && ch <= '9') {num * = 10; num + = ch - '0'; } cits pārtraukums; System.out.println ("num =" + num); System.out.println ("num kvadrātā =" + num * num); }} 

Saraksts 3 Pārvērst programma liek lietotājam ievadīt numuru (izmantojot System.out.print ("Lūdzu, ievadiet numuru:");). Tas nolasa šos ciparus - pa vienam - un pārvērš katra cipara skaitlisko kodu binārā skaitlī, kas tiek pievienots mainīgajam ar nosaukumu num. Visbeidzot, zvani uz System.out.println () izvada vērtību iekšpusē num un šīs vērtības kvadrāts līdz standarta izvades ierīcei.

Pārvērst demonstrē laikmetā izmantoto paņēmienu, kā izmantot cilpu while, lai pārbaudītu ciparu, mainīgo mainīgi iepriekš reizinot ar 10 (lai atbrīvotu vietu ienākošajam ciparam), pārveidojot ciparu par tā bināro ekvivalentu un pievienojot šo bināro ekvivalentu mainīgajam. Tomēr šī tehnika nav pareiza tehnika, ko izmantot, ja rakstāt programmu izvietošanai dažādās valstīs, jo dažās valstīs tiek izmantoti citi cipari, nevis no 0 līdz 9, piemēram, tamilu cipari. Lai programma darbotos ar citiem cipariem, jums jāpaplašina if paziņojums, lai pārbaudītu šos ciparus un modificētu ch - '0' izteiksme. Par laimi Java vienkāršo šo uzdevumu, nodrošinot Raksturs klase, kuru jūs izpētīsit nākamajā rakstā.

Standarta izeja

The standarta izvades ierīce ir tā operētājsistēmas daļa, kas kontrolē vietu, kur programma nosūta savu produkciju. Pēc noklusējuma standarta izvades ierīce izvadi nosūta ierīces draiverim, kas pievienots ekrānam. Tomēr izvades galamērķi var novirzīt uz ierīces draiveri, kas pievienots failam vai printerim, kā rezultātā viena un tā pati programma ekrānā parāda savus secinājumus, saglabā tos failā vai nodrošina rezultātu sarakstu kopijā.

Jūs varat sasniegt standarta izvadi, zvanot uz Java System.out.print () un System.out.println () metodes. Izņemot to, ka izdrukāt () metodes pēc datiem neizvada jaunas rindas rakstzīmi, abas metožu grupas ir līdzvērtīgas. Pastāv metodes Būla, rakstzīmju, rakstzīmju masīva, dubultprecīzā peldošā komata, peldošā komata, vesela skaitļa, garā vesela skaitļa, virknes un objekta vērtību izvadīšanai. Lai parādītu šīs metodes, 4. sarakstā tiek parādīts pirmkods Drukāt pieteikumu.

Saraksts 4. Print.java

// Print.java klase Drukāt {public static void main (String [] args) {boolean b = true; System.out.println (b); char c = 'A'; System.out.println (c); char [] carray = {'A', 'B', 'C'}; System.out.println (carray); dubultā d = 3,5; System.out.println (d); pludiņš f = -9,3f; System.out.println (f); int i = 'X'; System.out.println (i); garš l = 9000000; System.out.println (l); Virkne s = "abc"; System.out.println (s); System.out.println (new Print ()); }} 

4. saraksts, iespējams, ir izraisījis dažus jautājumus. Pirmkārt, kas tas viss ir System.out. biznesa darīšana priekšā println ()? Atkal atsaucieties uz Sistēma klase SDK dokumentācijā. Klase satur mainīgo, ko sauc ārā - objekts, kas izveidots no klases ar nosaukumu PrintStream. Perioda raksturs pēc Sistēma norāda uz to ārā pieder Sistēma. Perioda raksturs pēc ārā nosaka, ka println () pieder ārā. Citiem vārdiem sakot, println () ir metode, kas pieder objektam, ko sauc ārā, kas savukārt pieder klasei, ko sauc Sistēma.

Otrais jautājums, kuru jūs sev varētu uzdot, ir saistīts println () argumentu datu tipi: kā tas ir iespējams println () metodi izsaukt ar dažāda veida argumentu datiem? Atbilde: jo ir vairāki println () metodes PrintStream klasē. Izpildes laikā JVM zina, kurš println () metode izsaukšanai, pārbaudot metodi izsaukuma argumentu skaitu un to datu tipus. (Vairāku metožu deklarēšana ar tādu pašu nosaukumu, bet atšķirīgu argumentu skaitu un argumentu datu tipiem ir pazīstama kā metožu pārslodze. Es šo jēdzienu apspriedīšu nākamajā mēnesī.)

Visbeidzot, jūs varētu domāt par System.out.println (new Print ());. Šīs metodes izsaukums ilustrē println () metode, kurai nepieciešama Objekts arguments. Pirmkārt, radīšanas operators jauns izveido objektu no Drukāt klasi un atgriež atsauci uz šo objektu, kas pazīstams arī kā adrese. Visbeidzot, šī adrese kā arguments pāriet uz println () metode, kurai nepieciešama Objekts arguments. Metode pārveido objekta saturu par virkni un izvada šo virkni. Pēc noklusējuma virkne sastāv no objekta klases nosaukuma, kam seko an @ (at) rakstzīme, kam seko heksadecimāli formatēts vesels skaitlis, kas apzīmē objekta jaukšanas kodu. (Es gaidāmajā rakstā iepazīstināšu ar hashcodes un objektu pārveidošanu par virknēm.)

Sastādīt Drukāt.java un palaidiet programmu, izsniedzot šādu komandrindu: java Print. Jums vajadzētu redzēt deviņas izvades rindas. Novirziet šo izvadi uz out.dat failu, izsniedzot šādu komandrindu: java Print> out.dat. Tagad jūs varat apskatīt faila saturu.

Lielāka par zīmi, >, norāda standarta izvades novirzīšanu. Ikreiz, kad vēlaties novirzīt standarta izvades ierīci no ekrāna uz failu vai printeri, komandrindā norādiet šo simbolu, kam seko faila vai printera nosaukums. Piemēram, novirzīt Drukātizvadi uz Windows printeri, izsniedzot šādu komandrindu: java Print> prn.

$config[zx-auto] not found$config[zx-overlay] not found