JavaRush /Blog Java /Random-VI /Lớp PrintStream dùng để làm gì?

Lớp PrintStream dùng để làm gì?

Xuất bản trong nhóm
Xin chào! Hôm nay chúng ta sẽ nói về lớp học PrintStreamvà mọi thứ nó có thể làm. Lớp PrintStream dùng để làm gì? - 1Thực ra bạn đã quen với hai phương thức của lớp PrintStream. print()Đây là những và các phương thức println()mà bạn có thể sử dụng hàng ngày :) Vì một biến System.outlà một đối tượng PrintStreamnên khi bạn gọi một phương thức System.out.println(), bạn đang gọi một phương thức của lớp cụ thể này. Mục đích chung của lớp PrintStreamlà xuất thông tin ra một số luồng. Lớp này có một số hàm tạo. Dưới đây là một số trong những phổ biến nhất:
  • PrintStream(OutputStream outputStream)
  • PrintStream(File outputFile) throws FileNotFoundException
  • PrintStream(String outputFileName) throws FileNotFoundException
Như bạn có thể thấy, chúng ta có thể chuyển vào hàm tạo của đối tượng PrintStream, ví dụ: tên của tệp mà chúng ta muốn xuất dữ liệu vào. Hoặc, cách khác, chính đối tượng đó File. Hãy xem cách thức hoạt động của nó với các ví dụ:
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);
   }
}
Mã này sẽ tạo một tệp trên màn hình nền test.txt(nếu nó chưa tồn tại) và viết số, chuỗi và boolean-variable của chúng tôi vào đó một cách tuần tự. Dưới đây là nội dung file của chúng ta sau khi chương trình chạy:

222
Hello world!
false
Như chúng tôi đã nói ở trên, không cần thiết phải truyền chính đối tượng tệp đó File. Bạn chỉ cần chỉ định đường dẫn đến nó trong hàm tạo:
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);
   }
}
Mã này sẽ làm tương tự như mã trước. Một phương pháp thú vị khác để xem xét là , printf()hoặc đầu ra chuỗi được định dạng. "Chuỗi được định dạng" nghĩa là gì? Để giải thích, tôi sẽ đưa ra một ví dụ:
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\\Евгений\\Desktop\\test.txt");

       printStream.println("Hello!");
       printStream.println("I'm robot!");

       printStream.printf("My name is %s, my age is %d!", "Amigo", 18);

       printStream.close();

   }
}
Ở đây, thay vì viết rõ ràng tên và tuổi của rô-bốt trong một dòng, chúng tôi dường như để lại “không gian trống” cho thông tin này bằng cách sử dụng con trỏ %s%d. Và chúng tôi chuyển dữ liệu cần có ở những nơi này dưới dạng tham số. Trong trường hợp của chúng tôi, đây là chuỗi " Amigo " và số 18. Ví dụ: chúng tôi có thể tạo một khoảng trắng khác: giả sử , %bvà truyền một tham số khác. Nó dùng để làm gì? Trước hết, để tăng tính linh hoạt. Nếu chương trình của bạn cần thường xuyên hiển thị thông báo chào mừng, bạn sẽ phải nhập thủ công văn bản cần thiết cho mỗi robot mới. Bạn thậm chí sẽ không thể đặt văn bản này thành một hằng số: tên và tuổi của mọi người đều khác nhau! Nhưng bằng cách sử dụng phương thức mới, bạn có thể xuất ra một chuỗi có lời chào thành một hằng số và nếu cần, chỉ cần thay đổi các tham số trong phương thức printf().
import java.io.IOException;
import java.io.PrintStream;

public class Main {

   private static final String GREETINGS_MESSAGE = "My name is %s, my age is %d!";

   public static void main(String[] args) throws IOException {

       PrintStream printStream = new PrintStream("C:\\Users\\Евгений\\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();
   }
}

Giả mạo System.in

Trong bài giảng này, chúng ta sẽ “chiến đấu với hệ thống” và tìm hiểu cách thay thế một biến System.invà chuyển hướng đầu ra của hệ thống đến nơi chúng ta cần. Lớp PrintStream dùng để làm gì - 2Bạn có thể đã quên nó là gì System.in, nhưng sẽ không có sinh viên JavaRush nào quên được cấu trúc này:
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
System.in(như System.out) là một biến lớp tĩnh System. Nhưng, không giống như System.out, nó thuộc một lớp khác, cụ thể là InputStream. Theo mặc định System.in, đây là luồng đọc dữ liệu từ thiết bị hệ thống—bàn phím. Tuy nhiên, như trong trường hợp với System.out, chúng ta có thể thay thế nguồn dữ liệu và việc đọc sẽ không diễn ra từ bàn phím mà từ nơi chúng ta cần! Hãy xem một ví dụ:
import java.io.*;

public class Main {

   public static void main(String[] args) throws IOException {

       String greetings = "Hello! Меня зовут Амиго!\nЯ изучаю Java на сайте JavaRush.\nОднажды я стану крутым программистом!\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);
       }

   }
}
Vậy chúng ta đã làm gì? Thường System.inđược “trói” vào bàn phím. Nhưng chúng ta không muốn dữ liệu được đọc từ bàn phím: hãy để nó được đọc từ một dòng văn bản thông thường! Chúng tôi đã tạo một chuỗi và nhận nó dưới dạng mảng byte. Tại sao chúng ta cần byte? Thực tế nó InputStreamlà một lớp trừu tượng và chúng ta không thể tạo một thể hiện của nó. Bạn sẽ phải chọn một số lớp trong số những người thừa kế của nó. Ví dụ: chúng ta có thể lấy ByteArrayInputStream. Nó đơn giản và chỉ cần nhìn vào tên của nó cũng có thể hiểu rõ cách thức hoạt động của nó: nguồn dữ liệu của nó là một mảng byte. Vì vậy, chúng tôi tạo cùng một mảng byte này và chuyển nó đến hàm tạo của chúng tôi stream, nó sẽ đọc dữ liệu. Trên thực tế, mọi thứ đã sẵn sàng! Bây giờ chúng ta chỉ cần sử dụng phương thức này System.setIn()để đặt giá trị của biến một cách rõ ràng in. Trong trường hợp out, như bạn nhớ, rõ ràng là không thể đặt giá trị của biến: bạn phải sử dụng một phương thức đặc biệt setOut(). Sau khi đã gán InputStreambiến mà chúng ta đã tạo System.in, chúng ta cần kiểm tra xem ý tưởng của mình có hiệu quả hay không. Một người bạn cũ sẽ giúp chúng ta việc này - BufferedReader. Trong trường hợp bình thường, mã này sẽ khiến bảng điều khiển mở trong Intellij IDEa của bạn và dữ liệu bạn nhập từ bàn phím sẽ được đọc từ đó.
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

       String str;

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

           System.out.println(str);
       }
Nhưng khi chạy nó bây giờ, bạn sẽ thấy rằng văn bản của chúng ta từ chương trình sẽ chỉ được xuất ra bảng điều khiển, sẽ không có thao tác đọc từ bàn phím. Chúng ta đã thay đổi nguồn dữ liệu, bây giờ không phải là bàn phím mà là chuỗi của chúng ta! Thật dễ dàng và đơn giản :) Trong bài giảng hôm nay, chúng ta đã làm quen với một lớp mới và xem xét một “hack” nhỏ mới để làm việc với I/O. Đã đến lúc quay lại khóa học và giải quyết một số vấn đề :) Hẹn gặp lại các bạn trong bài giảng tiếp theo!
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION