【Java.IO】I/O 【字节/字符】【处理流】 - 【格式化输出打印流】 - PrintStream, PrintWriter
2014-09-29 17:50
791 查看
在整个java.io包中,打印流是输出信息最方便的类;主要包含字节打印流(PrintStream)和字符打印流(PrintWriter)。
PrintStream和PrintWriter都是处理流。
PrintStream
PrintWriter
对于PrintWriter,当不使用传入Writer的构造函数时,PrintWriter会利用传入的参数构造一个OutputStreamWriter对象,然后再new一个BufferedWriter对象out对这个OutputStreamWriter对象进行包装,之后的printXXX操作由这个BufferedWriter out完成;如果使用传入Writer的构造函数时,实际使用的就是传入的Writer对象out,是否进行了缓冲全在于传入的Writer对象;
在PrintStream的实现中,内部会new一个字节字符转换流对象OutputStreamWriter,其将字节流PrintStream转换为一个字符流,然后再new一个BufferedWriter对象对该writer进行包装;查看printXXX的实现可以发现,其printXXX方法实际上是由该BufferedWriter最终完成输出的。
对于使用printXXX系列方法的场合,二者之间没有什么区别。
自动flush:
对于PrintStream,如果设置了autoFlush = true的话,每当遇到换行符(调用println方法,输出一个换行字符或换行字节'\n'),缓冲区的内容就被强制输出(自动调用flush()函数)。
对于PrintWriter,如果设置了 autoFlush = true的话,与PrintStream不同,仅当调用了println, printf, format方法后才会自动flush缓冲区的内容,而不是像遇到换行符就输出。
使用示例:
输出结果:
PrintStream和PrintWriter都是处理流。
PrintStream
public class PrintStream extends FilterOutputStream implements Appendable, Closeable
PrintWriter
public class PrintWriter extends Writer
PrintStream V.S. PrintWriter
两个类均实现了类似printXXX的方法;对于writeXXX方法,PrintStream只包含输出字节的方法,PrintWriter只包含输出字符的方法;对于PrintWriter,当不使用传入Writer的构造函数时,PrintWriter会利用传入的参数构造一个OutputStreamWriter对象,然后再new一个BufferedWriter对象out对这个OutputStreamWriter对象进行包装,之后的printXXX操作由这个BufferedWriter out完成;如果使用传入Writer的构造函数时,实际使用的就是传入的Writer对象out,是否进行了缓冲全在于传入的Writer对象;
在PrintStream的实现中,内部会new一个字节字符转换流对象OutputStreamWriter,其将字节流PrintStream转换为一个字符流,然后再new一个BufferedWriter对象对该writer进行包装;查看printXXX的实现可以发现,其printXXX方法实际上是由该BufferedWriter最终完成输出的。
对于使用printXXX系列方法的场合,二者之间没有什么区别。
自动flush:
对于PrintStream,如果设置了autoFlush = true的话,每当遇到换行符(调用println方法,输出一个换行字符或换行字节'\n'),缓冲区的内容就被强制输出(自动调用flush()函数)。
对于PrintWriter,如果设置了 autoFlush = true的话,与PrintStream不同,仅当调用了println, printf, format方法后才会自动flush缓冲区的内容,而不是像遇到换行符就输出。
使用示例:
package com.gof.io.test; import java.io.ByteArrayInputStream; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintStream; import java.io.PrintWriter; public class PrintOutputApp { public static void main(String[] args){ InputStreamReader isr = null; PrintStream ps = null; PrintWriter pw = null; try{ // GB2312 Encoding byte[] barray = { (byte)0xca, (byte)0xe4, // 输 (byte)0xc8, (byte)0xeb, // 入 (byte)0xca, (byte)0xe4, // 输 (byte)0xb3, (byte)0xf6 // 出 }; isr = new InputStreamReader(new ByteArrayInputStream(barray), "GB2312"); ps = new PrintStream(System.out, true); pw = new PrintWriter(new OutputStreamWriter(System.out), true); int data = -1; while ( (data = isr.read()) != -1){ ps.print((char)data); pw.print((char)data); } ps.flush(); pw.flush(); }catch (Exception e){ e.printStackTrace(); }finally { try{ pw.close(); ps.close(); isr.close(); }catch(Exception e){ e.printStackTrace(); } } } }
输出结果:
输入输出输入输出
相关文章推荐
- java io系列25之 PrintWriter (字符打印输出流)
- java io系列25之 PrintWriter (字符打印输出流)
- java io系列25之 PrintWriter (字符打印输出流)
- Java-IO之PrintWriter(字符打印输出流)
- 【Java.IO】I/O 【字节/字符】【处理流】 - 之 - 【缓冲流 】- Buffered*
- Java-IO之PrintWriter(字符打印输出流)
- java io系列25之 PrintWriter (字符打印输出流)
- Java-IO之PrintWriter(字符打印输出流)
- java基础<IO输出与输入>--->IO流<字符流>
- JAVA IO - BufferedWriter 输出字符流
- 【Java】-- 输入/ 输出:探究java.io の 字节流
- java io系列16之 PrintStream(打印输出流)详解
- Java IO--字节-字符流转换
- JAVA IO - 格式化输出流
- java中格式化输出字符
- java I/O中的文件字节输出流和字符输出流
- Java.io包中的流的输入输出详解2(字符流) .
- Java IO学习3:字节-字符转换流
- Java io文件操作(按字符、字节、行、随机读取,追加,文件操作)
- 【JAVA IO】_字节-字符转换流笔记