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
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION