Programování

Java 101: Vstupy a výstupy standardního vstupu / výstupu

V předchozí Java 101 článků, zmínil jsem se o konceptech přesměrování, standardního vstupního zařízení a standardního výstupního zařízení. Abychom předvedli zadávání dat, nazýváme několik příkladů System.in.read (). Ukázalo se, že System.in.read () zadává data ze standardního vstupního zařízení. Abychom předvedli výstup dat, volali příklady System.out.print () a System.out.println (). Na rozdíl od System.in.read (), ty metody - pojmenované sekvence spustitelného kódu (k prozkoumání v článku příštího měsíce) - odeslat jejich výstup na standardní výstupní zařízení. Chcete se dozvědět více o standardních konceptech I / O? Číst dál!

Standardní I / O je standardizovaný mechanismus vstupu / výstupu, který pochází z operačního systému Unix. Ačkoli se tento mechanismus většinou používá se staršími operačními systémy bez grafického uživatelského rozhraní, standardní I / O stále hraje roli v moderních operačních systémech s grafickým uživatelským rozhraním (GUI), kde jej lidé používají k ladění nefunkčních programů ak výuce vstupu / výstupu v kurzy programování na úrovni.

Jak jste pravděpodobně uhodli, standardní I / O používá zařízení k zadávání a výstupu dat. Mezi tato zařízení patří standardní vstup, standardní výstup a standardní chyba.

Standardní vstup

The standardní vstupní zařízení je ta část operačního systému, která řídí, odkud program přijímá svůj vstup. Ve výchozím nastavení čte standardní vstupní zařízení tento vstup z ovladače zařízení připojeného ke klávesnici. Ale můžete přesměrovat, nebo přepněte vstupní zdroj na ovladač zařízení připojený k souboru, takže se zdá, že vstup „kouzelně“ vychází ze souboru - namísto klávesnice.

Program zadává svá data ze standardního vstupního zařízení voláním Java System.in.read () metoda. Podívejte se do dokumentace SDK a objevíte třídu s názvem Systém. Tato třída obsahuje proměnnou nazvanou v - objekt vytvořený z podtřídy InputStream. Znak období po Systém tvrdí, že v patří Systéma znak tečky po v tvrdí, že číst() patří v. Jinými slovy, číst() je metoda, která patří k objektu s názvem v, který zase patří do třídy zvané Systém. (Více o třídách, objektech a „příslušnosti k“ proberu příští měsíc.)

System.in.read () nepřijímá žádné argumenty a vrací celé číslo, což některým uvěřilo System.in.read () vrátí uživatelem zadaná celočíselná čísla. Objasnit, System.in.read () buď vrátí 7bitový kód ASCII klíče (pokud je standardní vstupní zařízení nastaveno na klávesnici), nebo 8bitový bajt ze souboru (pokud bylo standardní vstupní zařízení přesměrováno z klávesnice na soubor). V obou případech System.in.read () převede kód na 32bitové celé číslo a vrátí výsledek.

Předpokládejme, že standardní vstupní zařízení je nastaveno na klávesnici. Následuje popis toho, co se děje v systému Windows: Když zadáte klíč na klávesnici ovládané systémem Windows, operační systém uloží 7bitový kód ASCII tohoto klíče do interní vyrovnávací paměti klíče. Tato klíčová vyrovnávací paměť pojme až zhruba 16 kódů ASCII a je organizována jako datová struktura kruhové fronty typu první dovnitř / první ven. System.in.read () načte kód ASCII z hlavičky vyrovnávací paměti klíčů a poté tento kód odebere z vyrovnávací paměti klíčů. Tento 7bitový kód ASCII se poté převede na int - od System.in.read () prepending 25 zero bits to the code - and returns to the method's caller. Vteřina System.in.read () volání metody načte další kód ASCII, který je nyní v čele vyrovnávací paměti klíčů atd.

Předpokládejme, že ve vyrovnávací paměti klíčů nejsou žádné kódy ASCII. Co se stalo? System.in.read () čeká, až uživatel zadá klíče a stiskne terminátor. V systému Windows je tímto terminátorem Enter klíč. Lisování Enter způsobí, že Windows uloží návratový kód vozíku (ASCII 13) následovaný kódem nového řádku (ASCII 10) do vyrovnávací paměti klíčů. Proto může vyrovnávací paměť klíčů obsahovat několik kódů ASCII následovaných návratem vozíku a znakem nového řádku. První z těchto kódů se vrací z System.in.read (). Zkontrolujte tuto aktivitu zadáním, kompilací a spuštěním Echo aplikace; jeho zdrojový kód se objeví v seznamu 1.

Výpis 1. Echo.java

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

Echo dokončí následující kroky:

  1. Žádá System.out.print () metoda, která vyžaduje a Tětiva argument, k odeslání výzvy
  2. Volání System.in.read () zadávat kódy ASCII ze standardního vstupního zařízení jako 32bitová celá čísla
  3. Převede tato 32bitová celá čísla na 16bitové znaky Unicode pomocí (char) obsazení
  4. Žádá System.out.print () metoda, která vyžaduje a char argument, k ozvěně těchto znaků Unicode na standardní výstupní zařízení

Poslední tři kroky v předchozích čtyřech krocích probíhají ve smyčce while a pokračují, dokud se nečte znak nového řádku. Běžet Echo aby vstupoval z klávesnice a vystupoval na obrazovku, zadejte následující příkazový řádek: java Echo.

Ačkoli System.in.read () nikdy nevyvolá výjimku (definice tohoto pojmu viz téma počítání slov v tomto článku), když je standardní vstupní zařízení nastaveno na klávesnici, může vyvolat výjimku, když přesměrujete standardní vstupní zařízení z klávesnice na soubor. Předpokládejme například, že přesměrujete standardní vstupní zařízení na soubor a System.in.read () čte obsah ze souboru. Nyní předpokládejme, že se soubor nachází na disketě a uživatel během operace čtení tento disk vysune. Když dojde k vysunutí, System.in.read () vyvolá výjimku a informuje program, že nemůže přečíst soubor. To poskytuje důvod pro připojení hodí java.io.IOException doložka k hlavní() záhlaví metody. (Výjimky, vyvolání výjimek a související koncepty prozkoumáte v budoucím článku.)

Jak přesměrujete standardní vstupní zařízení tak, aby vstup pocházel ze souboru? Odpovědí je zavedení znaménka méně než, <, na příkazovém řádku a následujte tento symbol s názvem souboru. Chcete-li zjistit, jak to funguje, zadejte následující příkazový řádek: java Echo <>. Příkazový řádek přesměruje standardní vstupní zařízení na soubor s názvem Echo.java. Když Echo běží, protože každý řádek končí znakem nového řádku, pouze první řádek textu Echo.java Na obrazovce se zobrazí.

Předpokládejme, že potřebujete obslužný program, který načte celý soubor a buď zobrazí obsah souboru na obrazovce, zkopíruje tento obsah do jiného souboru nebo zkopíruje tento obsah na tiskárnu. Bohužel Echo program provádí tento úkol, dokud nenarazí na první znak nového řádku. Co děláš? Odpověď na problém spočívá v Typ aplikace. Výpis 2 poskytuje zdrojový kód:

Výpis 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á se Echo, nicméně, není tam žádná výzva, a while smyčka testuje proti -1 (což označuje konec souboru) místo \ n (což označuje konec řádku). Běžet Typ, zadejte následující příkazový řádek: java typ <>. Obsah Type.java - nebo jakýkoli jiný soubor - bude zobrazen. Jako experiment zkuste zadat java typ. Co si myslíte, že se stane? (Tip: Tento program se podobá Echo ale nekončí, dokud nestisknete Ctrl + C.)

Dříve jsem zmínil, že si to někteří programátoři mylně myslí System.in.read () vrací uživatelem zadané číslo. Jak jste právě viděli, není tomu tak. Ale co musíte udělat, pokud chcete použít System.in.read () získat číslo? Podívejte se na Konvertovat aplikace, jejíž zdrojový kód je uveden v seznamu 3.

Výpis 3. Convert.java

// Třída Convert.java Convert {public static void main (String [] args) hodí java.io.IOException {System.out.print ("Zadejte 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 druhou =" + num * num); }} 

Výpis 3 Konvertovat program vyzve uživatele k zadání čísla (přes System.out.print ("Zadejte prosím číslo:");). Přečte tyto číslice - jednu po druhé - a převede číselný kód každé číslice na binární číslo, které se přidá k proměnné zvané počet. Nakonec volá na System.out.println () zadejte hodnotu dovnitř počet a druhou mocninu této hodnoty na standardní výstupní zařízení.

Konvertovat demonstruje časem uznávanou techniku ​​použití smyčky while k testování číslice, předběžné vynášení proměnné o 10 (aby se vytvořil prostor pro příchozí číslici), převod číslice na její binární ekvivalent a přidání tohoto binárního ekvivalentu k proměnné. Tato technika však není dobrá technika, kterou lze použít, pokud píšete program pro nasazení v různých zemích, protože některé země používají jiné číslice než 0 až 9 - například tamilské číslice. Chcete-li, aby program fungoval s jinými číslicemi, musíte rozbalit příkaz if a otestovat tyto číslice a upravit ch - '0' výraz. Naštěstí Java tento úkol zjednodušuje tím, že poskytuje Charakter třídy, kterou prozkoumáte v budoucím článku.

Standardní výstup

The standardní výstupní zařízení je ta část operačního systému, která řídí, kam program odesílá svůj výstup. Ve výchozím nastavení standardní výstupní zařízení odesílá výstup do ovladače zařízení připojeného k obrazovce. Výstupní cíl však lze přesměrovat na ovladač zařízení připojený k souboru nebo tiskárně, což má za následek, že stejný program zobrazí své nálezy na obrazovce, uloží je do souboru nebo poskytne výpis výsledků v tištěné podobě.

Standardní výstup dosáhnete voláním Java System.out.print () a System.out.println () metody. Až na to, že tisk() metody nevydají za daty znak nového řádku, obě skupiny metod jsou ekvivalentní. Existují metody pro výstup logických hodnot, znaků, pole znaků, s plovoucí desetinnou čárkou s dvojitou přesností, s plovoucí desetinnou čárkou, celé číslo, dlouhé celé číslo, řetězec a hodnoty objektu. K prokázání těchto metod seznam 4 představuje zdrojový kód pro Tisk aplikace.

Výpis 4. Print.java

// Třída Print.java Tisk {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); dlouhé l = 9000000; System.out.println (l); Řetězec s = "abc"; System.out.println (s); System.out.println (nový tisk ()); }} 

Výpis 4 pro vás pravděpodobně spustil několik otázek. Za prvé, co to všechno je System.out. podnikání před println ()? Opět viz Systém třídy v dokumentaci SDK. Třída obsahuje proměnnou nazvanou ven - objekt vytvořený z třídy s názvem PrintStream. Znak období po Systém naznačuje to ven patří Systém. Znak období po ven tvrdí, že println () patří ven. Jinými slovy, println () je metoda, která patří k objektu s názvem ven, který zase patří do třídy zvané Systém.

Druhá otázka, kterou si možná kladete, zahrnuje println () datové typy argumentů: jak je možné to samé println () metoda, která má být volána s různými typy dat argumentů? Odpověď: protože jich je několik println () metody v PrintStream třída. Za běhu JVM ví, které println () metoda volání zkoumáním počtu argumentů volání metody a jejich datových typů. (Deklarace několika metod se stejným názvem, ale různým počtem argumentů a datových typů argumentů je známá jako přetížení metody. O této koncepci budu hovořit příští měsíc.)

Nakonec by vás mohlo zajímat System.out.println (nový tisk ());. Toto volání metody ilustruje println () metoda, která vyžaduje Objekt argument. Nejprve operátor vytvoření Nový vytvoří objekt z Tisk třídy a vrátí odkaz na - také známý jako adresa - tohoto objektu. Konečně tato adresa předává jako argument println () metoda, která vyžaduje Objekt argument. Metoda převádí obsah objektu na řetězec a tento řetězec vydává. Ve výchozím nastavení se řetězec skládá z názvu třídy objektu, za nímž následuje @ (zavináč) znak, následovaný hexadecimálním formátovaným celým číslem, které představuje hashcode objektu. (Hashkódy a převod objektů na řetězce představím v připravovaném článku.)

Kompilovat Print.java a spusťte program zadáním následujícího příkazového řádku: tisk Java. Mělo by se zobrazit devět řádků výstupu. Přesměrujte tento výstup na out.dat soubor zadáním následujícího příkazového řádku: tisk Java> out.dat. Nyní můžete zobrazit obsah souboru.

Znaménko větší než, >, označuje standardní přesměrování výstupu. Kdykoli budete chtít přesměrovat standardní výstupní zařízení z obrazovky na soubor nebo tiskárnu, zadejte na příkazovém řádku tento symbol následovaný názvem souboru nebo tiskárny. Například přesměrování Tiskvýstup na tiskárnu Windows vydáním následujícího příkazového řádku: tisk Java> prn.

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