程序员潇然 发表于 2022-8-26 11:51:22

JavaIO之PrintStream(十五)

### 功能简介

PrintStream 为其他输出流添加了功能,使它们能够方便地打印各种数据值表示形式
装饰器模式中具体的装饰类
它提供的功能就是便捷的打印各种数据形式
FilterInputStream为装饰器模式中的抽象角色
简言之,PrintStream可以快捷的打印输出各种类型的数据

!(data/attachment/forum/202208/26/114417hyv0irvdvxzyp9o0.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "image.png")

### 关键字段

autoFlush是否自动刷新的标志位
所谓自动刷新,就是每次调用方法后,看下标志位,如果设置了,那么调用一下out.flush()
比如下面这段代码

!(data/attachment/forum/202208/26/114447hpu4uas7lwitlawa.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "image.png")

所以,为了自动刷新,可以创建一个 PrintStream
这个autoFlush 会在:
写入byte数组之后,println调用,写入一个换行符,或者写入一个'\n'

这几种场景下自动刷新(如果是true)

### 构造方法

先看下他的私有的构造方法
其他所有的方法都是调用这两个构造方法

!(data/attachment/forum/202208/26/114524v7ttmjpttpt8jppb.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "image.png")

两个私有构造方法, 关注的主要信息就是OutputStream和autoFlush和 charset三个字段
OutputStream 作为实际被装饰的实体类
charset 指定的字符编码,如果不指定,那么将会使用默认的

**autoFlush默认是false**

```java
//直接传递OutputStream
PrintStream(OutputStream)
PrintStream(OutputStream, boolean)
PrintStream(OutputStream, boolean, String)


//通过File或者路径名 构造FileOutputStream作为FileOutputStream
PrintStream(String)
PrintStream(String, String)
PrintStream(File)
PrintStream(File, String)
```

文件相关的,autoFlush全部都是false

**PrintStream 永远不会抛出 IOException**
通过代码可以看得出来
内部维护了一个trouble标志位
发生了IOException异常时,捕捉后转换为trouble=true
可以通过checkError()方法进行返回

!(data/attachment/forum/202208/26/114830vq6at83jrgsgtrjp.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "image.png")

### 主要方法介绍

#### write

```java
write(int)
write(byte[], int, int)
```

代码上面一段也已经贴出来
增加了自动刷新的功能,并且还不会抛出异常

#### print系列

| 方法      | 说明                                                                                                      |
| --------- | --------------------------------------------------------------------------------------------------------- |
| println() | 通过写入行分隔符字符串终止当前行。行分隔符字符串由系统属性 line.separator 定义,不一定是单个换行符 ('\n') |

| 方法         | 说明                                                                                     |                                                                                                                               |
| -------------- | ---------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------- |
| print(boolean) | String.valueOf(boolean)生成字符串转换为字节 ,<br />以 write(int) 方法的方式写入这些字节 | +println() =println(boolean)                                                                                                |
| print(char)    | 字符转换为一个或多个字节以 write(int) 方法的方式写入这些字节                           | +println() =println(char)                                                                                                   |
| print(int)   | String.valueOf(int)生成字符串转换为字节以 write(int) 方法的方式写入这些字节            | +println() = println(int)                                                                                                   |
| print(long)    | String.valueOf(long)生成字符串转换为字节以 write(int) 方法的方式写入这些字节             | +println() = println(long)                                                                                                    |
| print(float)   | String.valueOf(float)生成字符串转换为字节以 write(int) 方法的方式写入这些字节            | +println() = println(float)                                                                                                   |
| print(double)| String.valueOf(double)生成字符串转换为字节以 write(int) 方法的方式写入这些字节         | +println() = println(double)                                                                                                |
| print(char[])| 字符转换为字节以 write(int) 方法的方式写入这些字节                                       | +println() = println(char[])                                                                                                |
| print(String)| 如果参数为 null,则打印字符串 "null"否则转换为字节以 write(int) 方法的方式写入这些字节   | +println() = println(String)                                                                                                |
| print(Object)| String.valueOf(Object)生成字符串转换为字节以 write(int) 方法的方式写入这些字节         | 不存在print(Object) +println()的情况,println(Object)==先调用 String.valueOf(x) 获取字符串值,然后再 print(String)+ println() |

print将会把数据转换为他们的字符串形式,然后转换为字节,然后在将字节写入


print 与println结合 可以变成println的形式
从代码也可以很直白的看出来,调用之后,然后newLine()
不过需要注意的是print(Object)他是特例

!(data/attachment/forum/202208/26/115344vj406y6z0y04zy36.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "image.png")

```java
printf(String, Object...)
printf(Locale, String, Object...)
format(String, Object...)
format(Locale, String, Object...)
```

!(data/attachment/forum/202208/26/115412wwmgkfml7555zplx.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "image.png")

产生格式化输出的每个方法都需要格式字符串 和参数列表
格式字符串是一个 String,它可以包含固定文本以及一个或多个嵌入的格式说明符
这个是个类似C语言printf的方法
使用的时候不熟悉直接查表对照即可
printf和format一回事



| 方法                           | 说明                                                                                                                                  |
| ------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------- |
| append(char)                   | 将指定字符添加到此输出流。<br />调用此方法的 out.append(c) 形式,行为与以下调用完全相同:out.print(c)最后加一个跟写一个显然没什么不同 |
| append(CharSequence)         | 将指定字符序列添加到此输出流                                                                                                          |
| append(CharSequence, int, int) | 将指定字符序列的子序列添加到此输出流                                                                                                |


flush()

close()

!(data/attachment/forum/202206/16/141330jha7st9soow8772i.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "common_log.png")
`转载务必注明出处:程序员潇然,疯狂的字节X,https://crazybytex.com/thread-151-1-1.html `
页: [1]
查看完整版本: JavaIO之PrintStream(十五)