Programiranje

Java 101: Vhodi in izhodi standardnega vhoda / izhoda

V predhodnem Java 101 člankov, sem se skliceval na koncepte preusmeritve, standardne vhodne naprave in standardne izhodne naprave. Za prikaz vnosa podatkov je bilo imenovanih nekaj primerov System.in.read (). Izkazalo se je, da System.in.read () vnaša podatke iz standardne vhodne naprave. Za prikaz izhodnih podatkov se imenujejo primeri System.out.print () in System.out.println (). Za razliko od System.in.read (), tiste metode - imenovana zaporedja izvršljive kode (ki jih bomo raziskali v članku prihodnjega meseca) - pošljejo svoj izhod na standardno izhodno napravo. Bi radi izvedeli več o standardnih konceptih V / I? Beri naprej!

Standardni I / O je standardiziran vhodno-izhodni mehanizem, ki izvira iz operacijskega sistema Unix. Čeprav se ta mehanizem večinoma uporablja pri starejših operacijskih sistemih, ki niso GUI, ima standardni I / O še vedno pomembno vlogo v sodobnih operacijskih sistemih GUI (grafični uporabniški vmesnik), kjer ga ljudje uporabljajo za odpravljanje napak v delujočih programih in za poučevanje vnosa / izhoda v tečaji programiranja na ravni.

Kot ste verjetno že uganili, standardni V / I uporablja naprave za vnos in izpis podatkov. Te naprave vključujejo standardni vhod, standardni izhod in standardno napako.

Standardni vhod

The standardna vhodna naprava je tisti del operacijskega sistema, ki nadzoruje, od kod program prejema svoj vložek. Standardna vhodna naprava privzeto bere ta vnos iz gonilnika naprave, pritrjenega na tipkovnico. Vendar lahko preusmeritev, ali preklopite, vhodni vir na gonilnik naprave, pritrjen na datoteko, tako da se zdi, da vhod "čarobno" prihaja iz datoteke - namesto s tipkovnice.

Program vnese svoje podatke iz standardne vhodne naprave s klicem Jave System.in.read () metoda. Poglejte v dokumentacijo SDK in odkrili boste predavanje z imenom Sistem. Ta razred vsebuje spremenljivko z imenom v - objekt, ustvarjen iz podrazreda InputStream. Znak obdobja po Sistem navaja, da v pripada Sistemin znak obdobja po v navaja, da preberi () pripada v. Z drugimi besedami, preberi () je metoda, ki pripada predmetu z imenom v, ki pa pripada razredu z imenom Sistem. (Več o razredih, predmetih in "pripadnosti" bom obravnaval naslednji mesec.)

System.in.read () ne jemlje argumentov in vrne celo število, zaradi česar so nekateri verjeli System.in.read () vrne uporabniško vnesene celoštevilke. Razčistiti, System.in.read () bodisi vrne 7-bitno kodo ASCII ključa (če je standardna vhodna naprava nastavljena na tipkovnico) ali 8-bitni bajt iz datoteke (če je bila standardna vhodna naprava s tipkovnice preusmerjena v datoteko). V obeh primerih System.in.read () pretvori kodo v 32-bitno celo število in vrne rezultat.

Predpostavimo, da je standardna vhodna naprava nastavljena na tipkovnico. Sledi opis dogajanja v sistemu Windows: Ko tipkate tipko na tipkovnici, ki jo nadzoruje Windows, operacijski sistem shrani 7-bitno kodo ASCII tega ključa v notranji medpomnilnik ključa. Ta medpomnilnik ključev vsebuje približno 16 kod ASCII in je organiziran kot struktura podatkov krožne čakalne vrste first-in / first-out. System.in.read () pridobi kodo ASCII iz glave medpomnilnika ključa in jo nato odstrani iz medpomnilnika ključa. Ta 7-bitna koda ASCII se nato pretvori v int - avtor System.in.read () predhodno dodajanje 25 nič bitov kodi - in se vrne klicatelju metode. Sekundo System.in.read () klic metode pridobi naslednjo kodo ASCII, ki je zdaj na vrhu medpomnilnika ključev itd.

Denimo, da v medpomnilniku ključev ni kod ASCII. Kar se zgodi? System.in.read () počaka, da uporabnik vpiše tipke in pritisne končnik. V operacijskem sistemu Windows je ta terminator Enter tipko. Pritisnite Enter povzroči, da Windows shrani povratno kodo nosilca (ASCII 13), čemur sledi koda nove vrstice (ASCII 10) v medpomnilnik ključev. Zato lahko medpomnilnik ključev vsebuje več kod ASCII, čemur sledi vrnitev nosilca in znak nove vrstice. Prva od teh kod se vrne iz System.in.read (). Preverite to dejavnost tako, da vnesete, sestavite in zaženete Odmev prijava; njegova izvorna koda je prikazana na seznamu 1.

Seznam 1. Echo.java

// razred Echo.java Echo {public static void main (String [] args) vrže java.io.IOException {int ch; System.out.print ("Vnesite nekaj besedila:"); while ((ch = System.in.read ())! = '\ n') System.out.print ((char) ch); }} 

Odmev opravi naslednje korake:

  1. Pokliče System.out.print () metoda, ki traja a Vrvica argument za izpis poziva
  2. Klici System.in.read () za vnos ASCII kod iz standardne vhodne naprave kot 32-bitna cela števila
  3. Ta 32-bitna cela števila pretvori v 16-bitne znake Unicode s pomočjo (char) igralska zasedba
  4. Pokliče System.out.print () metoda, ki traja a char argument za odmev teh znakov Unicode v standardno izhodno napravo

Zadnji trije koraki v prejšnjih štirih korakih se izvedejo v časovni zanki in se nadaljujejo, dokler se ne prebere znak nove vrstice. Teči Odmev tako da vnaša s tipkovnice in izpisuje na zaslon, izda naslednjo ukazno vrstico: java Echo.

Čeprav System.in.read () nikoli ne vrže izjeme (za definicijo tega izraza glejte temo o štetju besed v tem članku); če je standardna vhodna naprava nastavljena na tipkovnico, lahko vrže izjemo, ko standardno vhodno napravo s tipkovnice preusmerite na mapa. Denimo, da standardno vhodno napravo preusmerite v datoteko in System.in.read () prebere vsebino iz datoteke. Zdaj predpostavimo, da se datoteka nahaja na disketi in jo uporabnik med operacijo branja izvrže. Ko se izvrže izmet, System.in.read () vrže izjemo in obvesti program, da ne more prebrati datoteke. To je razlog za dodajanje vrže java.io.IOException klavzula glavni () glavo metode. (Izjeme, metanje izjem in sorodne koncepte boste raziskali v prihodnjem članku.)

Kako preusmerim standardno vhodno napravo, tako da vhod izvira iz datoteke? Odgovor je uvesti znak manj kot <, v ukazni vrstici in sledite temu simbolu z imenom datoteke. Če želite videti, kako to deluje, izdajte naslednjo ukazno vrstico: java Echo <>. Ukazna vrstica preusmeri standardno vhodno napravo v datoteko z imenom Echo.java. Kdaj Odmev teče, ker se vsaka vrstica konča z znakom nove vrstice, samo prva vrstica besedila v Echo.java na zaslonu.

Recimo, da potrebujete pripomoček, ki prebere celotno datoteko in prikaže vsebino datoteke na zaslonu, jo kopira v drugo datoteko ali kopira v tiskalnik. Na žalost Odmev program to nalogo izvaja le, dokler ne naleti na prvi znak nove vrstice. Kaj počneš? Odgovor na težavo je v Tip aplikacijo. Seznam 2 vsebuje izvorno kodo:

Seznam 2. Vpišite.java

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

Tip spominja Odmevvendar poziva ni, in zanka while preizkuša -1 (kar označuje konec datoteke) namesto \ n (kar označuje konec vrstice). Teči Tip, izdajte naslednjo ukazno vrstico: java Type <>. Vsebina Vnesite.java - ali katera koli datoteka je določena - bo prikazana. Kot poskus poskusite določiti java Type. Kaj misliš, da se bo zgodilo? (Namig: ta program je podoben Odmev vendar se ne konča, dokler ne pritisnete Ctrl + C.)

Prej sem omenil, da nekateri programerji to zmotno mislijo System.in.read () vrne uporabniško vneseno številko. Kot ste pravkar videli, temu ni tako. Kaj pa morate storiti, če želite uporabiti System.in.read () da prikličete številko? Oglejte si Pretvorba aplikacija, katere izvorna koda je predstavljena v seznamu 3.

Seznam 3. Convert.java

// Convert.java class Convert {public static void main (String [] args) vrže java.io.IOException {System.out.print ("Prosimo, vnesite številko:"); int num = 0; int ch; while ((ch = System.in.read ())! = '\ n') if (ch> = '0' && ch <= '9') {num * = 10; num + = ch - '0'; } sicer odmor; System.out.println ("num =" + num); System.out.println ("num kvadrat =" + število * število); }} 

Seznam 3 Pretvorba program pozove uporabnika, da vnese številko (prek System.out.print ("Prosimo, vnesite številko:");). Bere te številke - eno za drugo - in pretvori številčno kodo vsake številke v binarno število, ki je dodano spremenljivki, imenovani številka. Na koncu še klici na System.out.println () izpiši vrednost znotraj številka in kvadrat te vrednosti na standardno izhodno napravo.

Pretvorba prikazuje časovno priznano tehniko uporabe zanke while za testiranje številke, predmnožitev spremenljivke z 10 (da se sprosti prostor za vhodno številko), pretvorbo števke v njen binarni ekvivalent in dodajanje tega binarnega ekvivalenta spremenljivki. Vendar ta tehnika ni dobra tehnika, ki bi jo uporabljali, če pišete program za uvajanje v različnih državah, saj nekatere države uporabljajo številke, ki niso od 0 do 9 - na primer tamilske. Če želite, da program deluje z drugimi števkami, morate razširiti stavek if, da preizkusite te številke in spremenite ch - '0' izraz. Na srečo Java to nalogo poenostavi z zagotavljanjem Značaj razred, ki ga boste raziskali v prihodnjem članku.

Standardni izhod

The standardna izhodna naprava je tisti del operacijskega sistema, ki nadzoruje, kam program pošlje svoj izhod. Standardna izhodna naprava privzeto pošlje izhod gonilniku naprave, pritrjenemu na zaslon. Izhodni cilj pa je mogoče preusmeriti na gonilnik naprave, ki je pritrjen na datoteko ali tiskalnik, kar ima za posledico, da isti program na zaslonu prikaže svoje ugotovitve, jih shrani v datoteko ali zagotovi natisnjen seznam rezultatov.

Standardni izhod dosežete s klicem Jave System.out.print () in System.out.println () metode. Razen dejstva, da natisni () metode po podatkih ne prikažejo znaka nove vrstice, obe skupini metod sta enakovredni. Obstajajo metode za izpis logičnih vrednosti, znakov, nizov znakov, plavajoče vejice z dvojno natančnostjo, plavajoče vejice, celih števil, dolgih celih števil, nizov in vrednosti predmeta. Da bi prikazali te metode, seznam 4 predstavlja izvorno kodo Natisni aplikacijo.

Seznam 4. Print.java

// Print.java razred Print {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); dvojno d = 3,5; System.out.println (d); plovec f = -9,3f; System.out.println (f); int i = 'X'; System.out.println (i); dolga l = 9000000; System.out.println (l); Niz s = "abc"; System.out.println (s); System.out.println (novo Print ()); }} 

Seznam 4 je verjetno sprožil nekaj vprašanj za vas. Najprej, kaj vse je to System.out. posel pred println ()? Še enkrat, glej Sistem razreda v dokumentaciji SDK. Razred vsebuje spremenljivko z imenom ven - predmet, ustvarjen iz razreda z imenom PrintStream. Znak obdobja po Sistem pomeni, da ven pripada Sistem. Znak obdobja po ven navaja, da println () pripada ven. Z drugimi besedami, println () je metoda, ki pripada predmetu z imenom ven, ki pa pripada razredu z imenom Sistem.

Drugo vprašanje, ki si ga zastavljate, vključuje println () argumentirani tipi podatkov: kako je mogoče za isto println () metoda, ki jo je treba poklicati z različnimi vrstami argumentnih podatkov? Odgovor: ker jih je več println () metode v PrintStream razred. Med izvajanjem JVM ve, katero println () metoda za klic s preučevanjem števila argumentov za klic metode in njihovih podatkovnih vrst. (Razglasitev več metod z istim imenom, vendar različnim številom argumentov in podatkovnih vrst argumentov je znano kot preobremenitev metode. O tem konceptu bom razpravljala naslednji mesec.)

Končno se morda sprašujete o tem System.out.println (novo Print ());. Ta klic metode ponazarja println () metoda, ki traja Predmet prepir. Najprej operater ustvarjanja novo ustvari predmet iz Natisni razreda in vrne sklic na - znan tudi kot naslov - tega predmeta. Končno ta naslov preide kot argument na println () metoda, ki traja Predmet prepir. Metoda pretvori vsebino predmeta v niz in izpiše ta niz. Niz je privzeto sestavljen iz imena razreda predmeta, ki mu sledi znak @ (at), čemur sledi hexadecimalno oblikovano celo število, ki predstavlja hashcode objekta. (V naslednjem članku bom predstavil hashcode in pretvorbo predmetov v nize.)

Sestavi Natisni.java in zaženite program z izdajo naslednje ukazne vrstice: java Print. Videli bi devet izhodnih vrstic. Preusmerite ta izhod na out.dat datoteko z izdajo naslednje ukazne vrstice: java Natisni> out.dat. Zdaj si lahko ogledate vsebino datoteke.

Znak večji od >, označuje standardno preusmeritev izhoda. Kadar želite standardno izhodno napravo preusmeriti z zaslona v datoteko ali tiskalnik, v ukazni vrstici določite simbol, ki mu sledi ime datoteke ali tiskalnika. Na primer preusmeritev Natisniizhod v tiskalnik Windows z izdajo naslednje ukazne vrstice: java Natisni> prn.

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