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.
Ennek 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
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!
További olvasnivalók: |
---|
GO TO FULL VERSION