2012-02-29 28 views
23

Khi đọc về Java I/O, tôi nhận ra rằng có hai cách mà tôi có thể ghi vào đầu ra tiêu chuẩn.Viết để bàn giao tiếp với System.out và PrintWriter

Sau đây là đoạn mã mà sử dụng cả các kỹ thuật

import java.io.*; 
public class ConsoleIO { 

    public static void main(String[] args) { 
     System.out.println("Method 1"); 

     PrintWriter writer = new PrintWriter(System.out); 
     writer.println("Method 2"); 
     writer.flush(); 
     writer.close(); 
    } 
} 

Có bất kỳ lợi ích hiệu suất của việc sử dụng một trong khác không?

+2

thực tế vẫn là không có vấn đề gì kỹ thuật bạn sử dụng, viết cho bàn điều khiển luôn luôn là tốn kém. – frewper

+0

Tôi đã tò mò về sự khẳng định của frewper rằng việc ghi vào bàn điều khiển là tốn kém. Tôi đã tự nhận ra, nhưng tự hỏi * tại sao *. Ngắn của nó là I/O đệm. Đối với một cuộc thảo luận dài hơn (Python-trung tâm) kiểm tra câu trả lời của Piët Delport về chủ đề này: http://stackoverflow.com/questions/3857052/why-is-printing-to-stdout-so-slow-can-it-be- sped-up # 3857543 – RegularlyScheduledProgramming

Trả lời

13

Google nhanh chóng tiết lộ một chuỗi trên Coderanch hữu ích. Có một số cách khác để thực hiện viết bảng điều khiển nhưng dường như không có lợi ích thực sự khi sử dụng cái này hay cái khác ngoài việc viết ít mã hơn và việc tạo một đối tượng PrintWriter mới sẽ chiếm nhiều bộ nhớ hơn (cuối cùng). .

PrintWriter có thể ghi vào các nguồn khác ngoài bảng điều khiển, nó có thể ghi vào một HttpResponse ví dụ trong khi System.out.println chỉ ghi vào bàn điều khiển.

2

Không chỉ có hai cách, bạn cũng có thể tìm thấy một số cách khác để thực hiện việc này. Ví dụ bằng cách sử dụng lớp Consol của gói io, và có thể có thêm một số lớp hiện diện cho điều này.

Nhưng nếu bạn chỉ muốn in một cái gì đó trong consol, thì tôi nghĩ phương pháp đầu tiên là tốt nhất. Tại sao bạn nên đi 4 đến 5 dòng mã nếu nó có thể được thực hiện chỉ trong 1 dòng.

1

Sử dụng:

System.out.println("Method 1"); 

Đó là lời kêu gọi tĩnh mà là nhanh hơn so với lựa chọn nào khác. Ngoài ra, bạn không tạo bất kỳ đối tượng bổ sung nào như đối tượng PrinterWriter trong tùy chọn thứ hai.

13

khác nhau của hai phương pháp là:

  • Khi bạn sử dụng System.out.print("") bạn thực sự sử dụng một trường hợp PrintStream.
  • Trên thực tế sự khác biệt là trong hai lớp PrintStreamPrintWriter đó là:

    1. PrintStream là một dòng byte trong khi PrintWrite là một dòng ký tự.
    2. PrintStream sử dụng mã hóa mặc định của nền tảng trong khi với số PrintWriter, tuy nhiên bạn có thể vượt qua OutputStreamWriter bằng mã hóa cụ thể. cho mẫu: PrintStream stream = new PrintStream(output); PrintWriter writer = new PrintWriter(new OutputStreamWriter(output, "UTF-8"));

Bạn có thể chọn một cách tiếp cận hợp với yêu cầu của bạn.

1

Sử dụng PrintWriter làm cho đầu ra có thể được quốc tế hóa - vì mã hóa như UTF-8 có thể được chỉ định. Cả hai lớp PrintWriter và PrintStream chỉ nên được sử dụng cho các hoạt động như đầu ra của bàn điều khiển - không dùng cho lập trình mạng - vì điều trị ngắt dòng và phụ thuộc vào điều kiện ngoại lệ của nền tảng. Chương thứ hai của "Lập trình mạng Java" có một cuộc thảo luận tốt về điều này.

Các vấn đề liên quan