CodeGym /Blog Java /Random-PL /Klasa Java PrintStream
Autor
Vasyl Malik
Senior Java Developer at CodeGym

Klasa Java PrintStream

Opublikowano w grupie Random-PL
Cześć! Dzisiaj porozmawiamy o klasie Java PrintStream i wszystkim, co potrafi. Właściwie znasz już dwie metody klasy PrintStream . Są to print() i println() , których prawdopodobnie używasz codziennie :) Ponieważ zmienna System.out jest obiektem PrintStream , wywołujesz jedną z metod tej klasy, gdy wywołujesz System.out.println() .  Ogólnym celem klasy PrintStream jest wysyłanie informacji do jakiegoś strumienia. Dlaczego potrzebujemy klasy PrintStream — 1Ta klasa ma kilka konstruktorów. Oto niektóre z najczęściej używanych:
  • PrintStream(OutputStream outputStream)
  • PrintStream(File outputFile) zgłasza wyjątek FileNotFoundException
  • PrintStream(String outputFileName) zgłasza wyjątek FileNotFoundException
Na przykład możemy przekazać nazwę pliku wyjściowego do konstruktora PrintStream . Alternatywnie możemy przekazać obiekt File . Spójrzmy na kilka przykładów, aby zobaczyć, jak to działa:

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

   } 
}
Ten kod utworzy plik test.txt na pulpicie (jeśli jeszcze nie istnieje) i kolejno zapisze do niego naszą liczbę, ciąg znaków i wartość logiczną. Oto zawartość pliku po uruchomieniu programu:

222 
Hello world!
false
Jak powiedzieliśmy powyżej, nie musisz przekazywać obiektu File . Wystarczy po prostu przekazać konstruktorowi ścieżkę do pliku:

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); 
   } 
}
Ten kod robi to samo, co poprzedni kod. Inną interesującą metodą, na którą warto zwrócić uwagę, jest printf() , która generuje dane wyjściowe na podstawie ciągu formatującego. Co to jest „ciąg formatu”? Podam przykład:

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(); 
   } 
}
Tutaj, zamiast jawnie podawać imię i wiek naszego robota w łańcuchu, umieszczamy symbole zastępcze dla tych informacji, reprezentowane przez %s i %d . I przekazujemy jako argumenty dane, które je zastąpią. W naszym przypadku jest to ciąg znaków „ Amigo ” i liczba 18. Możemy utworzyć inny symbol zastępczy, powiedzmy %b , i przekazać kolejny argument. Dlaczego tego potrzebujemy? Przede wszystkim dla większej elastyczności. Jeśli Twój program wymaga częstego wyświetlania komunikatu powitalnego, musisz ręcznie wpisać niezbędny tekst dla każdego nowego robota. Nie możesz nawet ustawić tego tekstu jako stałego, ponieważ każdy ma inne imię i wiek! Ale korzystając z tej nowej metody, możesz wyizolować powitanie w postaci stałej iw razie potrzeby po prostu zmienić argumenty przekazywane do metody printf() .

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

Wymiana pliku System.in

W tej lekcji będziemy „walczyć z systemem” i nauczymy się, jak zastąpić zmienną System.in , aby przekierować wyjście systemu tam, gdzie chcemy. Możesz zapomnieć, czym jest System.in , ale żaden uczeń CodeGym nigdy nie zapomni tej konstrukcji:

BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
System.in  (podobnie jak System.out ) jest zmienną statyczną klasy System . Ale w przeciwieństwie do System.out odwołuje się do innej klasy, a mianowicie InputStream . Domyślnie System.in jest strumieniem, który odczytuje dane z urządzenia systemowego — klawiatury. Jednak podobnie jak w przypadku System.out możemy zastąpić klawiaturę jako źródło danych. Dane możemy odczytywać z dowolnego miejsca! Spójrzmy na przykład:

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

   } 
}
Więc co zrobiliśmy? System.in jest zwykle powiązany z klawiaturą. Ale nie chcemy odczytywać danych z klawiatury: niech dane będą odczytywane ze zwykłego ciągu znaków! Stworzyliśmy ciąg i otrzymaliśmy go jako tablicę bajtów. Dlaczego potrzebujemy bajtów? Chodzi o to, że InputStream jest klasą abstrakcyjną, więc nie możemy bezpośrednio utworzyć jej instancji. Musimy wybrać jednego z jego potomków. Na przykład możemy wybrać ByteArrayInputStream . Jest prosta, a sama nazwa mówi nam, jak działa: jej źródłem danych jest tablica bajtów. Tworzymy więc tablicę bajtów i przekazujemy ją do konstruktora naszego strumienia , który odczyta dane. A teraz wszystko jest gotowe! Teraz wystarczy użyć metody System.setIn()metoda, aby jawnie ustawić wartość zmiennej in . Pamiętasz, że bez out nie było również możliwe bezpośrednie ustawienie wartości zmiennej: musieliśmy użyć metody setOut() . Po przypisaniu naszego InputStream do zmiennej System.in chcemy sprawdzić, czy osiągnęliśmy zamierzony cel. Nasz stary przyjaciel BufferedReader przychodzi nam tutaj z pomocą. Normalnie ten kod otworzyłby konsolę w IntelliJ IDEA, a następnie odczytał dane wprowadzone z klawiatury.

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

       String str; 

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

           System.out.println(str); 
       }
Ale teraz, kiedy go uruchomisz, zobaczysz, że nasz ciąg jest po prostu wyświetlany w konsoli. Brak odczytu z klawiatury. Wymieniliśmy źródło danych. To już nie klawiatura, ale nasza struna! To takie proste :) W dzisiejszej lekcji poznaliśmy nową klasę i zbadaliśmy mały nowy hack do pracy z wejściami/wyjściami. Teraz czas wrócić do kursu i wykonać kilka zadań :) Do zobaczenia na kolejnej lekcji!
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION