Programovanie

Java 101: Vstupy a výstupy štandardného vstupu / výstupu

V pred Java 101 článkov som sa zmienil o konceptoch presmerovania, štandardného vstupného zariadenia a štandardného výstupného zariadenia. Na demonštráciu vkladania údajov je známych niekoľko príkladov System.in.read (). Ukazuje sa, že System.in.read () vstupné údaje zo štandardného vstupného zariadenia. Na demonštráciu výstupu údajov sa nazývajú príklady System.out.print () a System.out.println (). Na rozdiel od System.in.read (), tí metódy - pomenované sekvencie spustiteľného kódu (budú preskúmané v článku budúci mesiac) - pošlú ich výstup na štandardné výstupné zariadenie. Chcete sa dozvedieť viac o štandardných konceptoch I / O? Pokračuj v čítaní!

Štandardné I / O je štandardizovaný vstupno-výstupný mechanizmus, ktorý pochádza z operačného systému Unix. Aj keď sa tento mechanizmus väčšinou používa so staršími operačnými systémami, ktoré nie sú GUI, štandardné I / O stále zohrávajú úlohu v moderných operačných systémoch GUI (grafické používateľské rozhranie), kde ho ľudia používajú na ladenie nefunkčných programov a na učenie vstupu / výstupu v kurzy programovania na úrovni.

Ako ste už iste uhádli, štandardné I / O používajú na vstup a výstup dát zariadenia. Medzi tieto zariadenia patrí štandardný vstup, štandardný výstup a štandardná chyba.

Štandardný vstup

The štandardné vstupné zariadenie je tá časť operačného systému, ktorá riadi odkiaľ program prijíma svoje vstupy. Štandardne štandardné vstupné zariadenie číta tento vstup z ovládača zariadenia pripojeného ku klávesnici. Môžete však presmerovanie, alebo prepnite vstupný zdroj na ovládač zariadenia pripojený k súboru, takže sa zdá, že vstup „kúzelne“ pochádza zo súboru - namiesto klávesnice.

Program zadáva svoje údaje zo štandardného vstupného zariadenia volaním Java System.in.read () metóda. Prezrite si dokumentáciu SDK a objavíte triedu s názvom Systém. Táto trieda obsahuje premennú s názvom v - objekt vytvorený z podtriedy InputStream. Dobová postava po Systém uvádza, že v patrí Systéma bodka po v uvádza, že čítať() patrí v. Inými slovami, čítať() je metóda patriaca k objektu s názvom v, ktorá zasa patrí do triedy s názvom Systém. (Viac o triedach, predmetoch a „príslušnosti k“ budem diskutovať budúci mesiac.)

System.in.read () neberie žiadne argumenty a vráti celé číslo, čo niektorých viedlo k presvedčeniu, že System.in.read () vráti používateľom zadané celé čísla. Objasniť, System.in.read () buď vráti 7-bitový kód ASCII kľúča (ak je štandardné vstupné zariadenie nastavené na klávesnicu), alebo 8-bitový bajt zo súboru (ak bolo štandardné vstupné zariadenie presmerované z klávesnice na súbor). V každom prípade, System.in.read () prevedie kód na 32-bitové celé číslo a vráti výsledok.

Predpokladajme, že štandardné vstupné zariadenie je nastavené na klávesnicu. Nasleduje popis toho, čo sa deje v systéme Windows: Keď napíšete kláves na klávesnici riadenej systémom Windows, operačný systém uloží 7-bitový kód ASCII tohto kľúča do medzipamäte interného kľúča. Táto vyrovnávacia pamäť kľúčov obsahuje až približne 16 kódov ASCII a je organizovaná ako dátová štruktúra kruhového frontu prvý-prvý / prvý-von. System.in.read () načíta kód ASCII z hlavy vyrovnávacej pamäte kľúčov a potom tento kód odstráni z vyrovnávacej pamäte kľúčov. Tento 7-bitový kód ASCII sa potom prevedie na int - používateľom System.in.read () predpríprava 25 nulových bitov na kód - a vráti sa k volajúcemu metódy. Druhý System.in.read () volanie metódy načíta ďalší kód ASCII, ktorý je teraz v čele vyrovnávacej pamäte kľúčov atď.

Predpokladajme, že v pamäti kľúča nie sú žiadne kódy ASCII. Čo sa stane? System.in.read () čaká na to, kým užívateľ napíše klávesy a stlačte terminátor. V systéme Windows je týmto koncovým bodom Zadajte kľúč. Lisovanie Zadajte spôsobí, že Windows uloží návratový kód prepravy (ASCII 13) nasledovaný kódom nového riadku (ASCII 10) do vyrovnávacej pamäte kľúčov. Preto môže vyrovnávacia pamäť kľúčov obsahovať niekoľko kódov ASCII, za ktorými nasleduje návrat vozíka a znak nového riadku. Prvý z týchto kódov sa vracia z System.in.read (). Skontrolujte túto aktivitu zadaním, zostavením a spustením programu Echo žiadosť; jeho zdrojový kód sa nachádza v zozname 1.

Zoznam 1. Echo.java

// Echo.java class Echo {public static void main (String [] args) hodí java.io.IOException {int ch; System.out.print ("Zadajte text:"); while ((ch = System.in.read ())! = '\ n') System.out.print ((char) ch); }} 

Echo dokončí nasledujúce kroky:

  1. Žiada System.out.print () metóda, ktorá vyžaduje a String argument, na odoslanie výzvy
  2. Vyzýva System.in.read () na vstup ASCII kódov zo štandardného vstupného zariadenia ako 32-bitové celé čísla
  3. Skonvertuje tieto 32-bitové celé čísla na 16-bitové znaky Unicode pomocou (znak) obsadenie
  4. Žiada System.out.print () metóda, ktorá vyžaduje a char argument, aby sa tieto znaky Unicode odrazili na štandardné výstupné zariadenie

Posledné tri kroky v predchádzajúcich štyroch krokoch sa uskutočňujú v slučke while a pokračujú dovtedy, kým sa neprečíta znak nového riadku. Bežať Echo aby vstupoval z klávesnice a vystupoval na obrazovku, zadajte nasledujúci príkazový riadok: java Echo.

Hoci System.in.read () nikdy nevyvolá výnimku (definíciu tohto výrazu nájdete v téme počítania slov v tomto článku), keď je štandardné vstupné zariadenie nastavené na klávesnicu, môže vyvolať výnimku, keď presmerujete štandardné vstupné zariadenie z klávesnice na spis. Predpokladajme napríklad, že štandardné vstupné zariadenie presmerujete na súbor a System.in.read () načíta obsah zo súboru. Teraz predpokladajme, že sa súbor nachádza na diskete a používateľ tento disk počas operácie čítania vysunie. Keď dôjde k vysunutiu, System.in.read () vyvolá výnimku a informuje program, že nemôže čítať súbor. To poskytuje dôvod na doplnenie hodí java.io.IOException doložka do hlavný() hlavička metódy. (Výnimky, výnimky a podobné koncepty preskúmate v budúcom článku.)

Ako presmerujete štandardné vstupné zariadenie tak, aby vstup pochádzal zo súboru? Odpoveď je zaviesť znamienko menej ako, <, na príkazovom riadku a nasledujte tento symbol s názvom súboru. Ak chcete zistiť, ako to funguje, zadajte nasledujúci príkazový riadok: java Echo <>. Príkazový riadok presmeruje štandardné vstupné zariadenie na súbor s názvom Echo.java. Kedy Echo beží, pretože každý riadok končí znakom nového riadku, iba prvým riadkom textu Echo.java Na obrazovke sa zobrazí.

Predpokladajme, že potrebujete obslužný program, ktorý načíta celý súbor a buď zobrazí obsah súboru na obrazovke, skopíruje tento obsah do iného súboru alebo skopíruje tento obsah do tlačiarne. Bohužiaľ, Echo program vykonáva túto úlohu iba dovtedy, kým nenarazí na prvý znak nového riadku. Čo robíš? Odpoveď na problém spočíva v Typ žiadosť. Výpis 2 poskytuje zdrojový kód:

Zoznam 2. Type.java

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

Typ podobá sa Echo, však neexistuje žiadna výzva a slučka while sa testuje proti -1 (ktorý označuje koniec súboru) namiesto \ n (čo označuje koniec riadku). Bežať Typ, zadajte nasledujúci príkazový riadok: java typ <>. Obsah Typ.java - alebo akýkoľvek zadaný súbor - sa zobrazí. Ako experiment skúste uviesť java typ. Čo si myslíš, že sa stane? (Pomôcka: tento program sa podobá Echo ale nekončí, kým nestlačíte Ctrl + C.)

Predtým som spomínal, že niektorí programátori si to mylne myslia System.in.read () vráti číslo zadané používateľom. Ako ste práve videli, nie je to tak. Čo však musíte urobiť, ak chcete použiť System.in.read () získať číslo? Pozrite sa na Konvertovať aplikácia, ktorej zdrojový kód je uvedený v zozname 3.

Zoznam 3. Convert.java

// Trieda Convert.java Convert {public static void main (String [] args) hodí java.io.IOException {System.out.print ("Zadajte prosím číslo:"); int num = 0; int ch; while ((ch = System.in.read ())! = '\ n') if (ch> = '0' && ch <= '9') {num * = 10; num + = ch - '0'; } else break; System.out.println ("num =" + num); System.out.println ("num na druhú =" + num * num); }} 

Zoznam 3 Konvertovať program vyzve užívateľa na zadanie čísla (cez System.out.print ("Zadajte prosím číslo:");). Číta tieto číslice - jednu po druhej - a prevádza číselný kód každej číslice na binárne číslo, ktoré sa pridáva do premennej s názvom číslo. Nakoniec hovory na System.out.println () zadajte hodnotu dovnútra číslo a štvorček tejto hodnoty na štandardné výstupné zariadenie.

Konvertovať demonštruje osvedčenú techniku ​​použitia cyklu while na testovanie číslice, premultipling premennej o 10 (aby sa vytvoril priestor pre prichádzajúcu číslicu), prevod číslice na jej binárny ekvivalent a pridanie tohto binárneho ekvivalentu k premennej. Táto technika však nie je rozumnou technikou, ktorú môžete použiť, ak píšete program na nasadenie v rôznych krajinách, pretože niektoré krajiny používajú iné číslice ako 0 až 9 - napríklad tamilské číslice. Aby program fungoval s inými číslicami, musíte rozbaliť príkaz if, aby ste tieto číslice otestovali a upraviť znak ch - „0“ výraz. Našťastie Java túto úlohu zjednodušuje poskytnutím a Postava triedy, ktorej sa budete venovať v budúcom článku.

Štandardný výstup

The štandardné výstupné zariadenie je tá časť operačného systému, ktorá riadi, kam program odosiela svoj výstup. Štandardne štandardné výstupné zariadenie štandardne odosiela výstup do ovládača zariadenia pripojeného k obrazovke. Cieľ výstupu však možno presmerovať na ovládač zariadenia pripojený k súboru alebo tlačiarni, čo má za následok, že rovnaký program zobrazí svoje zistenia na obrazovke, uloží ich do súboru alebo poskytne výpis výsledkov v tlačenej podobe.

Štandardný výstup dosiahnete volaním Java System.out.print () a System.out.println () metódy. Až na to, že print () metódy nevypisujú za údajom nový riadok, tieto dve skupiny metód sú rovnocenné. Existujú metódy na výstup logických hodnôt, znakov, znakových polí, pohyblivej desatinnej čiarky s dvojnásobnou presnosťou, plávajúcej čiarky, celých čísel, dlhých čísel, reťazcov a objektov. Na demonštráciu týchto metód zoznam 4 predstavuje zdrojový kód pre server Tlač žiadosť.

Výpis 4. Print.java

// Print.java class 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); dvojité d = 3,5; System.out.println (d); float f = -9,3f; System.out.println (f); int i = 'X'; System.out.println (i); dlhé l = 9000000; System.out.println (l); Reťazec s = "abc"; System.out.println (s); System.out.println (nová tlač ()); }} 

Zoznam 4 pre vás pravdepodobne vyvolal niekoľko otázok. Po prvé, čo je to všetko System.out. obchodné podnikanie pred println ()? Opäť sa obráťte na Systém triedy v dokumentácii SDK. Trieda obsahuje premennú s názvom von - objekt vytvorený z triedy s názvom PrintStream. Dobová postava po Systém naznačuje to von patrí Systém. Dobová postava po von uvádza, že println () patrí von. Inými slovami, println () je metóda patriaca k objektu s názvom von, ktorá zasa patrí do triedy s názvom Systém.

Zahŕňa druhú otázku, ktorú si možno kladiete println () dátové typy argumentov: ako je to možné pre to isté println () metóda, ktorá sa má volať s rôznymi typmi údajov argumentov? Odpoveď: pretože ich je niekoľko println () metódy v PrintStream trieda. Za behu JVM vie, ktoré println () spôsob volania skúmaním počtu argumentov volania metód a ich dátových typov. (Deklarovanie niekoľkých metód s rovnakým názvom, ale rôznym počtom argumentov a dátových typov argumentov sa nazýva preťaženie metód. O tomto koncepte budem hovoriť budúci mesiac.)

Na záver by vás mohlo zaujímať System.out.println (nová tlač ());. Toto volanie metódy ilustruje println () metóda, ktorá vyžaduje Objekt argument. Najprv operátor vytvárania Nový vytvorí objekt z Tlač triedy a vráti odkaz na - tiež známy ako adresa - tohto objektu. Nakoniec táto adresa prechádza ako argument na println () metóda, ktorá vyžaduje Objekt argument. Metóda prevádza obsah objektu na reťazec a výstupom tohto reťazca. Predvolene sa reťazec skladá z názvu triedy objektu, za ktorým nasleduje znak @ znak (zavináč), za ktorým nasleduje celé číslo v hexadecimálnom formáte, ktoré predstavuje hašovací kód objektu. (Hashkódy a prevod objektov na reťazce predstavím v pripravovanom článku.)

Zostaviť Print.java a spustite program zadaním nasledujúceho príkazového riadku: tlač Java. Mali by ste vidieť deväť riadkov výstupu. Presmerujte tento výstup na server out.dat súbor zadaním nasledujúceho príkazového riadku: tlač Java> out.dat. Teraz si môžete pozrieť obsah súboru.

Znamienko viac ako, >, označuje štandardné presmerovanie výstupu. Kedykoľvek chcete presmerovať štandardné výstupné zariadenie z obrazovky na súbor alebo tlačiareň, zadajte v príkazovom riadku tento symbol a za ním názov súboru alebo tlačiarne. Napríklad presmerovanie Tlačvýstup na tlačiareň so systémom Windows zadaním nasledujúceho príkazového riadku: tlač Java> PRN.

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