2012-02-22 24 views
6

Tôi đã nghe lỏm được một cuộc tranh cãi về số System.out.print() hôm nay. Một người tuyên bố rằng kể từ print() không bao gồm việc chấm dứt \n, bộ đệm mà nó ghi sẽ cuối cùng sẽ lấp đầy và bắt đầu mất dữ liệu. Người kia tuyên bố rằng họ đã sử dụng System.out.print() cho tất cả các chương trình Java của họ và chưa bao giờ gặp phải vấn đề này.Bộ đệm System.out.print() của Java sẽ mãi mãi cho đến khi println()?

Người đầu tiên có đúng không? Có thể cho System.out.print() để bắt đầu chặn hoặc xóa dữ liệu nếu stdout đầy? Có một ví dụ về mã sẽ gây ra điều này?

+2

Sử dụng 'System.setOut()' để thay thế 'System.out' bằng luồng tùy chỉnh ném một ngoại lệ – paislee

+4

cả hai đều sai. '\ n' không liên quan gì đến nó, gọi' .close() 'hoặc' .flush() 'có mọi thứ cần làm với nội dung của một dòng được viết ra hoặc bị mất. –

Trả lời

11

Khi bộ đệm được sử dụng bởi System.out.print lấp đầy, đầu ra được ghi vào tệp (hoặc thiết bị đầu cuối hoặc mục tiêu dữ liệu khác được kết nối với luồng đầu ra tiêu chuẩn của chương trình), dẫn đến bộ đệm trống. Viết đầu ra mà không quan tâm đến kích thước bộ đệm là việc sử dụng bình thường. Bạn sẽ không bao giờ sụp đổ hoặc chặn chương trình của bạn hoặc mất dữ liệu từ không gọi flush.

Bạn chỉ cần gọi flush một cách rõ ràng nếu bạn cần cung cấp dữ liệu ngay bên ngoài chương trình của mình ngay lập tức. Ví dụ, nếu chương trình của bạn đang trao đổi dữ liệu qua lại với chương trình khác, và bạn đang gửi yêu cầu đến chương trình đó và sẽ chờ trả lời của chương trình đó, bạn cần gọi flush sau khi gửi yêu cầu của bạn để đảm bảo rằng chương trình khác nhận được nó. Tương tự như vậy, nếu chương trình của bạn (hoặc máy nó chạy trên) treo, chỉ có đầu ra đến lần cuối cùng bạn gọi là flush được đảm bảo đã được viết ra.

Nếu luồng được đặt tự động xả, sau đó viết ký tự dòng mới (rõ ràng hoặc thông qua println) cũng tốt như gọi flush. Gọi số close cũng gọi số flush (đó là lý do tại sao close có thể ném một số IOException: có thể phải ghi dữ liệu và không thể, ví dụ: vì luồng được kết nối với tệp trên đĩa đầy đủ).

Lưu ý rằng xả bộ đệm có thể khiến chương trình chặn, nếu luồng System.out được kết nối với không sẵn sàng ngay lập tức để nhận dữ liệu (ví dụ: khi dữ liệu được chuyển đến chương trình khác không đọc dữ liệu của nó ngay lập tức). Vì bộ đệm có thể được xả sạch bất cứ lúc nào (vì bộ đệm xảy ra đầy), bất kỳ cuộc gọi nào đến print với đối số không trống đều có khả năng chặn.

Để biết thêm thông tin, hãy xem buffered streams tutorial và tài liệu của java.io.PrintStream class.