CodeGym/Java blog/Véletlen/Java PrintStream osztály
John Squirrels
Szint
San Francisco

Java PrintStream osztály

Megjelent a csoportban
Szia! Ma a Java PrintStream osztályról fogunk beszélni, és mindenről, amit tehet. Valójában már ismeri a PrintStream osztály két módszerét. Ezek a print() és a println() , amelyeket valószínűleg minden nap használsz :) Mivel a System.out változó egy PrintStream objektum, ennek az osztálynak az egyik metódusát hívod meg a System.out.println() meghívásakor .  A PrintStream osztály általános célja, hogy információkat küldjön valamilyen adatfolyamnak. Miért van szükségünk a PrintStream osztályra - 1Ennek az osztálynak több konstruktora is van. Íme néhány a leggyakrabban használtak közül:
  • PrintStream (OutputStream outputStream)
  • A PrintStream(File outputFile) FileNotFoundException kivételt dob
  • A PrintStream(String outputFileName) FileNotFoundException kivételt dob
Például átadhatjuk a kimeneti fájl nevét a PrintStream konstruktornak. Alternatív megoldásként átadhatunk egy File objektumot. Nézzünk néhány példát, hogy lássuk, hogyan működik ez:
import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintStream;

public class Main {

   public static void main(String arr[]) throws FileNotFoundException
   {
       PrintStream filePrintStream = new PrintStream(new File("C:\\Users\\Username\\Desktop\\test.txt"));

       filePrintStream.println(222);
       filePrintStream.println("Hello world");
       filePrintStream.println(false);

   }
}
Ez a kód létrehoz egy test.txt fájlt az asztalon (ha még nem létezik), és egymás után beírja a számunkat, karakterláncunkat és logikai értékünket. Íme a fájl tartalma a program futtatása után:
222
Hello world!
false
Ahogy fentebb említettük, nem kell átadnia egy Fájl objektumot. Elég, ha egyszerűen átadja a fájl elérési útját a konstruktornak:
import java.io.FileNotFoundException;
import java.io.PrintStream;

public class Main {

   public static void main(String arr[]) throws FileNotFoundException
   {
       PrintStream filePrintStream = new PrintStream("C:\\Users\\Username\\Desktop\\test.txt");

       filePrintStream.println(222);
       filePrintStream.println("Hello world");
       filePrintStream.println(false);
   }
}
Ez a kód ugyanaz, mint az előző kód. Egy másik érdekes módszer, amelyre érdemes odafigyelni, a printf() , amely formátum karakterlánc alapján állítja elő a kimenetet. Mi az a "formátum karakterlánc"? Hadd mondjak egy példát:
import java.io.IOException;
import java.io.PrintStream;

public class Main {

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

       PrintStream printStream = new PrintStream("C:\\Users\\Steve\\Desktop\\test.txt");

       printStream.println("Hello!");
       printStream.println("I'm a robot!");

       printStream.printf("My name is %s. I am %d!", "Amigo", 18);

       printStream.close();
   }
}
Itt ahelyett, hogy kifejezetten megadnánk robotunk nevét és életkorát a karakterláncban, helyőrzőket helyezünk el ehhez az információhoz, amelyet %s és %d jelképez . És érvként adjuk át azokat az adatokat, amelyek helyettesítik őket. Esetünkben ez az " Amigo " karakterlánc és a 18-as szám. Létrehozhatunk egy másik helyőrzőt, mondjuk %b , és átadhatunk egy másik argumentumot. Miért van erre szükségünk? Mindenekelőtt a nagyobb rugalmasság érdekében. Ha a program megköveteli, hogy gyakran jelenítsen meg üdvözlő üzenetet, akkor manuálisan kell begépelnie a szükséges szöveget minden új robothoz. Ezt a szöveget nem is lehet állandóvá tenni, hiszen mindenkinek más a neve és a kora! Ezzel az új módszerrel azonban elkülönítheti az üdvözlést egy konstansban, és ha szükséges, egyszerűen módosíthatja a printf() metódusnak átadott argumentumokat.
import java.io.IOException;
import java.io.PrintStream;

public class Main {

   private static final String GREETINGS_MESSAGE = "My name is %s. I am %d!";

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

       PrintStream printStream = new PrintStream("C:\\Users\\Steve\\Desktop\\test.txt");

       printStream.println("Hello!");
       printStream.println("We are robots!");


       printStream.printf(GREETINGS_MESSAGE, "Amigo", 18);
       printStream.printf(GREETINGS_MESSAGE, "R2-D2", 35);
       printStream.printf(GREETINGS_MESSAGE, "C-3PO", 35);

       printStream.close();
   }
}

A System.in cseréje

Ebben a leckében "harcolni fogunk a rendszerrel", és megtanuljuk, hogyan cseréljük le a System.in változót, hogy a rendszer kimenetét oda irányíthassuk, ahová csak akarjuk. Lehet, hogy elfelejti, mi az a System.in , de ezt a konstrukciót egyetlen CodeGym diák sem felejti el:
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
A System.in  (akárcsak a System.out ) a System osztály statikus változója . A System.out-tal ellentétben azonban egy másik osztályra hivatkozik, nevezetesen az InputStream -re . Alapértelmezés szerint a System.in egy adatfolyam, amely egy rendszereszközről – a billentyűzetről – olvas adatokat. Csakúgy, mint a System.out esetében , lecserélhetjük a billentyűzetet adatforrásként. Bárhonnan olvashatjuk az adatokat! Nézzünk egy példát:
import java.io.*;

public class Main {

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

       String greetings = "Hi! My name is Amigo!\nI'm learning Java on the CodeGym website.\nOne day I will become a cool programmer!\n";
       byte[] bytes = greetings.getBytes();

       InputStream inputStream = new ByteArrayInputStream(bytes);

       System.setIn(inputStream);

       BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

       String str;

       while ((str = reader.readLine())!= null) {

           System.out.println(str);
       }

   }
}
Szóval mit csináltunk? A System.in általában a billentyűzethez van kötve. De nem a billentyűzetről akarunk adatokat olvasni: olvassuk ki az adatokat egy közönséges karakterláncból! Létrehoztunk egy karakterláncot, és bájttömbként kaptuk meg. Miért van szükségünk bájtokra? A helyzet az, hogy az InputStream egy absztrakt osztály, így nem tudunk belőle közvetlenül példányt létrehozni. Ki kell választanunk az egyik leszármazottját. Választhatjuk például a ByteArrayInputStream lehetőséget . Egyszerű, és már a neve is elárulja, hogyan működik: adatforrása egy bájttömb. Tehát létrehozunk egy bájttömböt, és átadjuk az adatfolyamunk konstruktorának, amely beolvassa az adatokat. És most minden készen áll! Most már csak a System.setIn()metódus az in változó értékének explicit beállítására . Emlékezzünk vissza, az out nélkül sem lehetett közvetlenül beállítani a változó értékét: a setOut() metódust kellett használnunk. Miután az InputStream-ünket a System.in változóhoz rendeltük , ellenőrizni akarjuk, hogy elértük-e a célunkat. Régi barátunk, BufferedReader segít itt. Normális esetben ez a kód megnyitotta volna a konzolt az IntelliJ IDEA-ban, majd beolvassa a billentyűzetről beírt adatokat.
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

       String str;

       while ((str = reader.readLine())!= null) {

           System.out.println(str);
       }
De most, amikor futtatja, látni fogja, hogy a karakterláncunk egyszerűen megjelenik a konzolban. Nincs olvasás a billentyűzetről. Lecseréltük az adatforrást. Ez már nem a billentyűzet, hanem a mi húrunk! Ilyen egyszerű :) A mai órán egy új osztályt ismerhettünk meg, és egy kis új hacket fedeztünk fel az I/O-val való munkavégzéshez. Itt az ideje, hogy visszatérjünk a kurzushoz és teljesítsünk néhány feladatot :) Találkozunk a következő órán!
Hozzászólások
  • Népszerű
  • Új
  • Régi
Hozzászólás írásához be kell jelentkeznie
Ennek az oldalnak még nincsenek megjegyzései