CodeGym/Blog Java/Ngẫu nhiên/Lớp Java PrintStream

Lớp Java PrintStream

Xuất bản trong nhóm
CHÀO! Hôm nay chúng ta sẽ nói về lớp Java PrintStream và mọi thứ nó có thể làm. Trên thực tế, bạn đã quen thuộc với hai phương thức của lớp PrintStream . Chúng là print()println() , mà bạn có thể sử dụng hàng ngày :) Bởi vì biến System.out là một đối tượng PrintStream , nên bạn đang gọi một trong các phương thức của lớp này khi bạn gọi System.out.println() .  Mục đích chung của lớp PrintStream là gửi thông tin đến một luồng nào đó. Tại sao chúng ta cần lớp PrintStream - 1Lớ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 được sử dụng:
  • PrintStream(OutputStream đầu raStream)
  • PrintStream(File outputFile) ném FileNotFoundException
  • PrintStream(String outputFileName) ném FileNotFoundException
Ví dụ: chúng ta có thể chuyển tên của tệp đầu ra cho hàm tạo PrintStream . Ngoài ra, chúng ta có thể truyền một đối tượng File . Hãy xem xét một số ví dụ để xem nó hoạt động như thế nào:
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 test.txt trên màn hình nền (nếu nó chưa tồn tại) và ghi tuần tự số, chuỗi và boolean của chúng tôi vào đó. Đây là nội dung tập tin sau khi chúng ta chạy chương trình:
222
Hello world!
false
Như chúng tôi đã nói ở trên, bạn không cần phải truyền đối tượng Tệp . Chỉ cần chuyển đường dẫn tệp tới hàm tạo là đủ:
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 làm tương tự như mã trước đó. Một phương pháp thú vị khác đáng để chúng ta chú ý là printf() , tạo ra kết quả dựa trên chuỗi định dạng. "chuỗi định dạng" là gì? Để tôi lấy 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\\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();
   }
}
Ở đây, thay vì nêu rõ tên và tuổi của rô-bốt của chúng tôi trong chuỗi, chúng tôi đặt các trình giữ chỗ cho thông tin này, được biểu thị bằng %s%d . Và chúng tôi chuyển dữ liệu sẽ thay thế chúng làm đối số. Trong trường hợp của chúng tôi, đây là chuỗi " Amigo " và số 18. Chúng tôi có thể tạo một trình giữ chỗ khác, giả sử %b và chuyển một đối số khác. Tại sao chúng ta cần điều này? Trên hết, để linh hoạt hơn. Nếu chương trình của bạn yêu cầu bạn hiển thị thông báo chào mừng thường xuyên, bạn sẽ phải nhập văn bản cần thiết theo cách thủ công cho mỗi rô-bốt mới. Bạn thậm chí không thể biến văn bản này thành một hằng số, vì mọi người đều có tên và tuổi khác nhau! Nhưng khi sử dụng phương thức mới này, bạn có thể cô lập lời chào trong một hằng số và nếu cần, chỉ cần thay đổi các đối số được truyền cho 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. 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();
   }
}

Thay thế System.in

Trong bài học này, chúng ta sẽ "chiến đấu với hệ thống" và học cách thay thế biến System.in để chuyển hướng đầu ra của hệ thống đến bất cứ nơi nào chúng ta muốn. Bạn có thể quên System.in là gì, nhưng không sinh viên CodeGym nào quên cấu trúc này:
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
System.in  (giống như System.out ) là một biến tĩnh của lớp System . Nhưng không giống như System.out , nó tham chiếu đến một lớp khác, cụ thể là InputStream . Theo mặc định, System.in là luồng đọc dữ liệu từ thiết bị hệ thống — bàn phím. Tuy nhiên, giống như với System.out , chúng ta có thể thay thế bàn phím làm nguồn dữ liệu. Chúng tôi có thể đọc dữ liệu từ bất cứ nơi nào chúng tôi muốn! Hãy xem xét một ví dụ:
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);
       }

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

       String str;

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

           System.out.println(str);
       }
Nhưng bây giờ khi bạn chạy nó, bạn sẽ thấy rằng chuỗi của chúng ta được hiển thị đơn giản trong bảng điều khiển. Không có đọc từ bàn phím. Chúng tôi đã thay thế nguồn dữ liệu. Nó không còn là bàn phím, mà là chuỗi của chúng ta! Đơn giản vậy thôi :) Trong bài học hôm nay, chúng ta đã làm quen với một lớp mới và khám phá một thủ thuật nhỏ mới để làm việc với I/O. Bây giờ là lúc quay lại khóa học và hoàn thành một số nhiệm vụ :) Hẹn gặp lại trong bài học tiếp theo!
Bình luận
  • Phổ biến
  • Mới
Bạn phải đăng nhập để đăng nhận xet
Trang này chưa có bất kỳ bình luận nào