CodeGym /Java-Blog /Random-DE /Java PrintStream-Klasse
Autor
Vasyl Malik
Senior Java Developer at CodeGym

Java PrintStream-Klasse

Veröffentlicht in der Gruppe Random-DE
Hallo! Heute sprechen wir über die Java PrintStream-Klasse und alles, was sie kann. Eigentlich kennen Sie bereits zwei Methoden der PrintStream- Klasse. Es handelt sich um print() und println() , die Sie wahrscheinlich jeden Tag verwenden :) Da die System.out- Variable ein PrintStream- Objekt ist, rufen Sie eine der Methoden dieser Klasse auf, wenn Sie System.out.println() aufrufen .  Der allgemeine Zweck der PrintStream- Klasse besteht darin, Informationen an einen Stream zu senden. Warum wir die PrintStream-Klasse brauchen – 1Diese Klasse verfügt über mehrere Konstruktoren. Hier sind einige der am häufigsten verwendeten:
  • PrintStream(OutputStream OutputStream)
  • PrintStream(File OutputFile) löst eine FileNotFoundException aus
  • PrintStream(String outputFileName) löst eine FileNotFoundException aus
Beispielsweise können wir den Namen der Ausgabedatei an den PrintStream- Konstruktor übergeben. Alternativ können wir ein File- Objekt übergeben. Schauen wir uns einige Beispiele an, um zu sehen, wie das funktioniert:

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); 

   } 
}
Dieser Code erstellt eine test.txt-Datei auf dem Desktop (sofern sie noch nicht vorhanden ist) und schreibt nacheinander unsere Zahl, unsere Zeichenfolge und unseren Booleschen Wert hinein. Hier sind die Dateiinhalte, nachdem wir das Programm ausgeführt haben:

222 
Hello world!
false
Wie oben erwähnt, müssen Sie kein File- Objekt übergeben. Es reicht aus, einfach den Dateipfad an den Konstruktor zu übergeben:

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); 
   } 
}
Dieser Code macht dasselbe wie der vorherige Code. Eine weitere interessante Methode, die unsere Aufmerksamkeit verdient, ist printf() , die eine Ausgabe basierend auf einer Formatzeichenfolge erzeugt. Was ist eine „Formatzeichenfolge“? Lassen Sie mich ein Beispiel geben:

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(); 
   } 
}
Anstatt explizit den Namen und das Alter unseres Roboters in der Zeichenfolge anzugeben, fügen wir hier Platzhalter für diese Informationen ein, dargestellt durch %s und %d . Und wir übergeben als Argumente die Daten, die sie ersetzen werden. In unserem Fall ist dies die Zeichenfolge „ Amigo “ und die Zahl 18. Wir könnten einen weiteren Platzhalter erstellen, sagen wir %b , und ein weiteres Argument übergeben. Warum brauchen wir das? Vor allem für mehr Flexibilität. Wenn Ihr Programm erfordert, dass Sie häufig eine Willkommensnachricht anzeigen, müssen Sie den erforderlichen Text für jeden neuen Roboter manuell eingeben. Sie können diesen Text nicht einmal zu einer Konstante machen, da jeder einen anderen Namen und ein anderes Alter hat! Aber mit dieser neuen Methode können Sie die Begrüßung in einer Konstante isolieren und bei Bedarf einfach die an die printf()- Methode übergebenen Argumente ändern.

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(); 
   } 
} 

Ersetzen von System.in

In dieser Lektion werden wir „das System bekämpfen“ und lernen, wie man die System.in- Variable ersetzt, um die Systemausgabe dorthin umzuleiten, wo wir wollen. Sie vergessen vielleicht, was System.in ist, aber kein CodeGym-Schüler wird dieses Konstrukt jemals vergessen:

BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
System.in ist  (genau wie System.out ) eine statische Variable der Systemklasse . Aber im Gegensatz zu System.out verweist es auf eine andere Klasse, nämlich InputStream . Standardmäßig ist System.in ein Stream, der Daten von einem Systemgerät liest – der Tastatur. Allerdings können wir, genau wie bei System.out , die Tastatur als Datenquelle ersetzen. Wir können Daten von jedem beliebigen Ort aus lesen! Schauen wir uns ein Beispiel an:

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); 
       } 

   } 
}
Was haben wir also gemacht? System.in ist normalerweise an die Tastatur gebunden. Aber wir wollen keine Daten von der Tastatur lesen: Lassen wir die Daten von einem gewöhnlichen String lesen! Wir haben einen String erstellt und ihn als Byte-Array erhalten. Warum brauchen wir Bytes? Die Sache ist die, dass InputStream eine abstrakte Klasse ist, sodass wir keine Instanz davon direkt erstellen können. Wir müssen einen seiner Nachkommen auswählen. Beispielsweise können wir ByteArrayInputStream wählen . Es ist einfach und allein der Name verrät uns, wie es funktioniert: Seine Datenquelle ist ein Byte-Array. Also erstellen wir ein Byte-Array und übergeben es an den Konstruktor unseres Streams , der die Daten liest. Und jetzt ist alles fertig! Jetzt müssen wir nur noch System.setIn() verwenden.Methode, um den Wert der in- Variablen explizit festzulegen. Wie Sie sich erinnern, war es mit out auch nicht möglich, den Wert der Variablen direkt festzulegen: Wir mussten die Methode setOut() verwenden . Nachdem wir unseren InputStream der System.in- Variablen zugewiesen haben, wollen wir prüfen, ob wir unser Ziel erreicht haben. Unser alter Freund BufferedReader kommt uns hier zu Hilfe. Normalerweise hätte dieser Code die Konsole in IntelliJ IDEA geöffnet und dann die von Ihnen über die Tastatur eingegebenen Daten gelesen.

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

       String str; 

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

           System.out.println(str); 
       }
Aber wenn Sie es jetzt ausführen, werden Sie sehen, dass unsere Zeichenfolge einfach in der Konsole angezeigt wird. Es erfolgt kein Ablesen über die Tastatur. Wir haben die Datenquelle ersetzt. Es ist nicht mehr die Tastatur, sondern unsere Saite! So einfach ist das :) In der heutigen Lektion haben wir eine neue Klasse kennengelernt und einen kleinen neuen Hack für die Arbeit mit I/O erkundet. Jetzt ist es an der Zeit, zum Kurs zurückzukehren und einige Aufgaben zu erledigen :) Wir sehen uns in der nächsten Lektion!
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION