CodeGym /Java блог /Случаен /Java PrintStream клас
John Squirrels
Ниво
San Francisco

Java PrintStream клас

Публикувано в групата
здрасти Днес ще говорим за класа Java PrintStream и всичко, което може да прави. Всъщност вече сте запознати с два метода на класа PrintStream . Те са print() и println() , които вероятно използвате всеки ден :) Тъй като променливата System.out е PrintStream обект, вие извиквате един от методите на този клас, когато извиквате System.out.println() .  Общата цел на класа PrintStream е да изпраща информация към няHowъв поток. Защо се нуждаем от класа PrintStream - 1Този клас има няколко конструктора. Ето някои от най-често използваните:
  • PrintStream(OutputStream outputStream)
  • PrintStream(File outputFile) хвърля FileNotFoundException
  • PrintStream(String outputFileName) хвърля FileNotFoundException
Например, можем да предадем името на изходния файл на конструктора PrintStream . Като алтернатива можем да предадем File обект. Нека да разгледаме няколко примера, за да видим How работи това:

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

   } 
}
Този code ще създаде файл test.txt на работния плот (ако все още не съществува) и последователно ще запише нашия номер, низ и булева стойност в него. Ето съдържанието на file, след като стартираме програмата:

222 
Hello world!
false
Както казахме по-горе, не е нужно да предавате File обект. Достатъчно е просто да предадете пътя на file към конструктора:

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); 
   } 
}
Този code прави същото като предишния code. Друг интересен метод, който заслужава вниманието ни, е printf() , който произвежда изход въз основа на форматиращ низ. Какво е "форматен низ"? Нека дам пример:

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(); 
   } 
}
Тук, instead of изрично да посочим името и възрастта на нашия робот в низа, ние поставяме контейнери за тази информация, представени от %s и %d . И предаваме като аргументи данните, които ще ги заменят. В нашия случай това е низът " Amigo " и числото 18. Можем да създадем друг контейнер, да речем %b , и да подадем друг аргумент. Защо имаме нужда от това? Преди всичко за по-голяма гъвкавост. Ако вашата програма изисква често да показвате приветствено съобщение, ще трябва ръчно да въвеждате необходимия текст за всеки нов робот. Дори не можете да направите този текст константа, тъй като всеки има различни имена и възраст! Но използвайки този нов метод, можете да изолирате поздрава в константа и, ако е необходимо, просто да промените аргументите, предадени на метода 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(); 
   } 
} 

Подмяна на System.in

В този урок ще се „борим със системата“ и ще научим How да заменим променливата System.in , за да пренасочим системния изход към където пожелаем. Може да забравите Howво е System.in , но никой студент на CodeGym никога няма да забрави тази конструкция:

BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
System.in  (точно като System.out ) е статична променлива на класа System . Но за разлика от System.out , той препраща към друг клас, а именно InputStream . По подразбиране System.in е поток, който чете данни от системно устройство - клавиатурата. Въпреки това, точно Howто при System.out , можем да заменим клавиатурата като източник на данни. Можем да четем данни от където пожелаем! Да разгледаме един пример:

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

   } 
}
И така, Howво направихме? System.in обикновено е свързан с клавиатурата. Но ние не искаме да четем данни от клавиатурата: нека данните се четат от обикновен низ! Създадохме низ и го получихме като масив от byteове. Защо се нуждаем от byteове? Работата е там, че InputStream е абстрактен клас, така че не можем да създадем негов екземпляр директно. Трябва да изберем един от неговите потомци. Например, можем да изберем ByteArrayInputStream . Той е прост и самото му име ни казва How работи: неговият източник на данни е byteов масив. Така че създаваме byteов масив и го предаваме на конструктора на нашия поток , който ще прочете данните. И сега всичко е готово! Сега просто трябва да използваме System.setIn()метод за изрично задаване на стойността на променливата in . Без out , ще си спомните, също не беше възможно да зададем стойността на променливата директно: трябваше да използваме метода setOut() . След като присвоим нашия InputStream на променливата System.in , искаме да проверим дали сме постигнали целта си. Нашият стар приятел BufferedReader ни идва на помощ тук. Обикновено този code би отворил конзолата в IntelliJ IDEA и след това би прочел данните, които сте въвели от клавиатурата.

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

       String str; 

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

           System.out.println(str); 
       }
Но сега, когато го стартирате, ще видите, че нашият низ просто се показва в конзолата. Няма четене от клавиатурата. Заменихме източника на данни. Вече не е клавиатурата, а нашата струна! Толкова е просто :) В днешния урок се запознахме с нов клас и проучихме малък нов хак за работа с I/O. Сега е време да се върнете към курса и да изпълните някои задачи :) Ще се видим в следващия урок!
Коментари
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION