2015-08-24 2 views
1

Я знаю, что PrintWriter действительно хорош, если мы хотим написать отформатированные данные, а также я знаю использование BufferedWriter для улучшения производительности ввода-вывода.Будируется ли PrintWriter?

Но я пытался что-то вроде этого,

PrintWriter pw = new PrintWriter(System.out); 
pw.println("Statement 1"); 
pw.println("Statement 2"); 
//pw.flush(); 

Я заметил, что когда вровень метод комментируется не выход, но когда я раскомментировать его, я получаю желаемый результат.

Это возможно только при буферизации PrintWriter. Если да, то в чем смысл обертывания PrintWriter с использованием BufferedWriter и затем его записи?

Хотя javadoc нигде не упоминает, что PrintWriter буферизирован, но это кажется таким.

+0

все авторы имеют метод смыва. – nafas

ответ

3

Я проверил версии JDK, начиная с 1.6.0_45 и все они имеют this конструктор подарок:

/** 
* Creates a new PrintWriter from an existing OutputStream. This 
* convenience constructor creates the necessary intermediate 
* OutputStreamWriter, which will convert characters into bytes using the 
* default character encoding. 
* 
* @param out  An output stream 
* @param autoFlush A boolean; if true, the <tt>println</tt>, 
*     <tt>printf</tt>, or <tt>format</tt> methods will 
*     flush the output buffer 
* 
* @see java.io.OutputStreamWriter#OutputStreamWriter(java.io.OutputStream) 
*/ 
public PrintWriter(OutputStream out, boolean autoFlush) { 
this(new BufferedWriter(new OutputStreamWriter(out)), autoFlush); 

Поэтому PrintWritter использует буферизованный вывод. Если вы хотели бы использовать код, который вы отметили, вы можете создать PrintWriter с AutoFlush набором для истинной, что будет гарантировать, что с помощью одного из println, printf или format методов будет промывать поток. Таким образом, ваш код будет выглядеть в данном контексте:

PrintWriter pw = new PrintWriter(System.out, true); 
pw.println("Statement 1"); 
pw.println("Statement 2"); 
+0

Ну, просто хочу отметить, что если он не упоминается нигде в спецификациях Java, что 'PrintWriter' должен использовать буферы, это может не сохраниться в будущих версиях Java. Реализации могут измениться. Я почти уверен, что это называется абстракция или инкапсуляция, но не уверена. –

+0

@JohnRed спасибо за ваш комментарий, если вы считаете, что ответ можно улучшить, отредактируйте его. –

5

Из источника Java 8 для PrintWriter

/** 
* Creates a new PrintWriter from an existing OutputStream. This 
* convenience constructor creates the necessary intermediate 
* OutputStreamWriter, which will convert characters into bytes using the 
* default character encoding. 
* 
* @param out  An output stream 
* @param autoFlush A boolean; if true, the <tt>println</tt>, 
*     <tt>printf</tt>, or <tt>format</tt> methods will 
*     flush the output buffer 
* 
* @see java.io.OutputStreamWriter#OutputStreamWriter(java.io.OutputStream) 
*/ 
public PrintWriter(OutputStream out, boolean autoFlush) { 
    this(new BufferedWriter(new OutputStreamWriter(out)), autoFlush); 

Вы можете видеть, что PrintWriter использует BufferedWriter и что он имеет возможность autoFlush, которая будет иметь смысл только, если он был буфер.

2

PrintWriter буферизирован. Разница в том, что PrintWriter предлагает удобные методы для записи форматированных строковых представлений объектов, таких как println() и printf(). Он также имеет авто-промывку (поэтому, очевидно, он имеет буфер).

Оба класса являются эффективными. Если вы включите автоматическую промывку PrintWriter, это может быть меньше (потому что он будет очищаться каждый раз, когда вы вызываете что-то вроде println()). Другое отличие состоит в том, что PrintWriter не позволяет вам напрямую писать байты.

+0

PrintWriter тоже имеет методы записи. «Другое отличие заключается в том, что PrintWriter не позволяет вам напрямую писать байты»: я не понимаю этого утверждения. –

0

Я думаю, что с PrintWriter тоже можно читать строки сразу, было бы с помощью буфера.

Смежные вопросы