功能简介

 
PrintWriter   向文本输出流打印对象的格式化表示形式
他与PrintStream的逻辑上功能目的是相同的--他们都想做同一件事情--更便捷的格式化打印输出
 
PrintWriter实现了PrintStream 中的所有 print 方法,除了那些用于写入原始字节的方法,对于那些字节,程序应该使用未编码的字节流进行写入
PrintStream会在换行符时自动调用自动刷新
PrintWriter在这一点上与PrintWriter不同,
只有在调用 println、printf 或 format 的其中一个方法时才可能完成此操作
类似,PrintStream   此类中的方法不会抛出 I/O 异常,可以通过 checkError() 检查是否出现错误
 
PrintWriter也是装饰器模式
只不过看起来没那么典型而已
他直接继承Writer   省略了抽象装饰器角色Decorator
PrintWriter 既充当了Decorator也是一个ConcreteDecorator
它内部包含了一个Writer out
 
 

构造方法

 
他内部有一个Writer out ,而且刚才我们已经说了他是装饰器模式
所以他必然会需要一个out,你从构造方法的实际情况也可以看得出来
构造方法主要内容包括下面三部分:
    1. 首先需要一个Writer
    2. 自动刷新的标志
    3. 字符编码的设置
    对于一个Writer
    1. 他要么就是一个直接的Writer
    2. 要么是一个new OutputStreamWriter( OutputStream) 把OutputStream转换为Writer
    3. 另外,通过File或者String路径名,也可以构造FileOutputStream  ,他就是一个OutputStream,也就是下面的形式:
        new OutputStreamWriter( new FileOutputStream(File/String路径) )   
自动刷新,如果不传递,默认false
编码如果不设置,那么是系统默认
 
最根本的构造方法是
最根本的为什么没有字符编码相关的?
其实, 还有一个私有的
私有的构造方法,将带有字符编码情况的进行了二次的包装
在创建 OutputStreamWriter时使用
私有的构造方法还是绕回去到上面说的这个根本的构造方法去了
你会从构造方法中可以看得出来
如果构造方法中指定了编码
将会经由这个私有的构造方法转发下

如果没指定将会使用我们上面说的那个最根本的形式

    public PrintWriter(Writer out,
                       boolean autoFlush) {
不指定编码的 
全部都是使用PrintWriter(Writer out, boolean autoFlush)
带编码的借助于私有构造方法进行请求转发
private PrintWriter(Charset charset, File file)
说了那么多,其实也只还是需要记住下面这一个就好了
PrintWriter(Writer out, boolean autoFlush)
只有File参数或者String路径参数 才会设置编码的参数,
如果设置了编码的参数的话,将会在把他们转换为Writer时, 也就是 new OutputStreamWriter 中通过指定编码参数构造
 
 

Write方法

write方法的本质还是将数据写入到输出流
提供了5个版本的write
void write(char[] buf)
          将字符数组 写入
void write(char[] buf, int off, int len)
          将字符数组的某一部分  写入
void write(int c)
          将单个字符 写入
void write(String s)
          将字符串 写入
void write(String s, int off, int len)
          将字符串的某一部分 写入
 
三个基础方法,两个简化版方法
看得出来,类似PrintStream PrintWriter 也不会抛出IOException异常
可以通过  checkError  方法查看 trouble 的状态 
 
 

print(xxx) /println(xxx)

println()
通过写入行分隔符字符串终止当前行。行分隔符字符串由系统属性 line.separator 定义,不一定是单个换行符 ('\n')
 
print(boolean)
+ println()  = println(boolean)
print(char)
+ println()  = println(char)
print(int)
+ println()  = println(int)
print(long)
+ println()  = println(long)
print(float)
+ println()  = println(float)
print(double)
+ println()  = println(double)
print(char[])
+ println()  = println(char[])
print(String)
+ println()  = println(String)
print(Object) println(String.valueOf(Object))+ println()  = println(Object)
稍微特殊,先转换为String    String.valueOf(Object)
然后print(String)+ println()
 
可以看得出来  print系列都是调用的write方法
而且,基本上是write(String s)方法
boolean 会翻译成 字符串 true 或者false,然后调用write
String 如果是null 翻译成字符串 null    然后调用write
除了Object略微特殊以外,其他所有的print 和 println结合之后可以产生对应的println(xxx)的形式
 

append

三个版本的append方法

    append(char)
    append(java.lang.CharSequence)
    append(java.lang.CharSequence, int, int)
 
内部全部都是依赖于write方法
 
 

printf 与 format

PrintWriter内部也有一个Formatter
printf(java.util.Locale, java.lang.String, java.lang.Object...)
printf(java.lang.String, java.lang.Object...)
format(java.util.Locale, java.lang.String, java.lang.Object...)
format(java.lang.String, java.lang.Object...)
printf借助于format
format依赖Formatter
jdk1.8中 format方法与PrintStream 中几乎一样的,几乎一样的,几乎一样的....
 
 
PrintWriter提供了close以及flush方法
如下图所示,依赖于内部out 的 close和flush 也没什么好说的
 

总结

 
PrintWriter 构造方法很多,提供出来的方法也很多,看起来让人眼花缭乱
其实他就是一个装饰工具类,底层逻辑也很简单
既然是工具性质的
1. 自然需要有足够便捷的构造形式,你看那么多构造方法,最终不过也就是一种形式的构造方法
2. 自然有能够有多变的输出形式才能够说是便捷的输出打印嘛
对于Writer家族的一些基本操作,基本上是沿用了Write
 
所谓的增加的便捷亮点各种print和println
也就只是使用Writer本身的write方法打印输出他们的字符 形式
转换为字符的规则为:
基本数据类型和Object 会使用String.valueOf进行转换  
字符 字符数组 String本身就是字符/字符串的形式
 
另外的一个亮点是printf 同PrintStream中的是一样的,想要弄清楚重点在于弄清楚 Formatter了
 
上面说了,他既然是装饰工具流,所以说他必然要依赖于其他的输出流
PrintWriter就是依赖Writer,他就是来给这个Writer增加更便捷的打印输出功能的
既然着重点在于格式化输出数据,那么他的关注点自然在于数据的形式,而不是在于怎么写,所以write方法都几乎不动使用的还是原来的
然后在实际的调用各种print方法的时候,在对方法的入参进行转换,换成了字符的形式而已
 
 
 

[二十四]JavaIO之PrintWriter的更多相关文章

  1. Bootstrap<基础二十四> 缩略图

    Bootstrap 缩略图.大多数站点都需要在网格中布局图像.视频.文本等.Bootstrap 通过缩略图为此提供了一种简便的方式.使用 Bootstrap 创建缩略图的步骤如下: 在图像周围添加带有 ...

  2. 二十四、Struts2中的UI标签

    二十四.Struts2中的UI标签 Struts2中UI标签的优势: 数据回显 页面布局和排版(Freemark),struts2提供了一些常用的排版(主题:xhtml默认 simple ajax) ...

  3. WCF技术剖析之二十四: ServiceDebugBehavior服务行为是如何实现异常的传播的?

    原文:WCF技术剖析之二十四: ServiceDebugBehavior服务行为是如何实现异常的传播的? 服务端只有抛出FaultException异常才能被正常地序列化成Fault消息,并实现向客户 ...

  4. VMware vSphere 服务器虚拟化之二十四 桌面虚拟化之手动池管理物理机

    VMware vSphere 服务器虚拟化之二十四 桌面虚拟化之手动池管理物理机 VMwareView手动池可以管理物理计算机 说明: 环境基于实验二十三 1.准备一台Windows 7的物理计算机名 ...

  5. Bootstrap入门(二十四)data属性

    Bootstrap入门(二十四)data属性 你可以仅仅通过 data 属性 API 就能使用所有的 Bootstrap 插件,无需写一行 JavaScript 代码.这是 Bootstrap 中的一 ...

  6. 3360: [Usaco2004 Jan]算二十四

    3360: [Usaco2004 Jan]算二十四 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 6  Solved: 6[Submit][Statu ...

  7. JAVA之旅(二十四)——I/O流,字符流,FileWriter,IOException,文件续写,FileReader,小练习

    JAVA之旅(二十四)--I/O流,字符流,FileWriter,IOException,文件续写,FileReader,小练习 JAVA之旅林林总总也是写了二十多篇了,我们今天终于是接触到了I/O了 ...

  8. 二十四. Python基础(24)--封装

    二十四. Python基础(24)--封装 ● 知识结构   ● 类属性和__slots__属性 class Student(object):     grade = 3 # 也可以写在__slots ...

  9. (C/C++学习笔记) 二十四. 知识补充

    二十四. 知识补充 ● 子类调用父类构造函数 ※ 为什么子类要调用父类的构造函数? 因为子类继承父类,会继承到父类中的数据,所以子类在进行对象初始化时,先调用父类的构造函数,这就是子类的实例化过程. ...

随机推荐

  1. SharePoint2016: 使用powerShell启用project web app

    1. 创建pwa承载的webApplication   在SharePoint2016管理中心>应用程序管理>管理web应用程序,新建web应用程序>sharepoint-1001, ...

  2. VB用API模拟截屏键PrintScreen

    很多人用 SendKeys "{PRTSC}" 模拟截屏键 PrintScreen 的时候提示<错误:'70' 拒绝的权限>,于是经常遇到人问...干脆写下来 '声明 ...

  3. myeclipse集成maven

    myeclipse集成maven 打开myeclipse---Window----Preferences---Maven4MyEclipse--Installations----Add,如图所示: 这 ...

  4. 等高布局display:table

    display:table用法: 父元素:display:table; 子元素:display:table-cell; 注:使用display:table-cell元素部分出现空白缝隙的问题:设置 . ...

  5. xshell登陆服务器步骤

    Xshell远程连接服务器 打开xshell后找到左上角第一个“文件”点击,弹出来一个下拉框,选择“新建”点击(或者直接按下快捷键“Alt+n”).         点击“新建”之后就会出现下面这样一 ...

  6. SpringBoot几种定时任务的实现方式

    定时任务实现的几种方式: Timer:这是java自带的java.util.Timer类,这个类允许你调度一个java.util.TimerTask任务.使用这种方式可以让你的程序按照某一个频度执行, ...

  7. jieba库与好玩的词云的学习与应用实现

    经过了一些学习与一些十分有意义的锻(zhe)炼(mo),我决定尝试一手新接触的python第三方库 ——jieba库! 这是一个极其优秀且强大的第三方库,可以对一个文本文件的所有内容进行识别,分词,甚 ...

  8. jq 点击复制div里面的内容 如果粘贴到富文本中,会将样式,里面所有的标签,文字一并粘贴进去

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  9. OO第一次博客作业

    OO第一次博客作业 一.三次作业的bug反省 1.自己发现别人的问题 (1)输入处理的问题,比如第一次作业,主要就是处理输入的字符串,然后有同学的正则表达式有问题,则对于一些错误输入就不能正确判断. ...

  10. 问题:这个新申请的内存为什么不能free掉?(已解决)

    一.问题描述 先上代码, /*** 省略 ***/ uChar *base64 = NULL; /*** 省略 ***/ base64 = (一段内存) /*** 省略 ***/ base64 = s ...