【Java I/O 流】4 - 8 打印流

§4-8 打印流

4-8.1 用于输出的打印流

打印流是一种只用于输出的高级流,其体系如下:

image

打印流只有输出,没有输入,具有以下三个特点:

  • 打印流只操作文件目的地,不操作数据源;

    由于打印流只负责输出,因此只写不读,只操作文件目的地,不操作数据源;

  • 具有特殊的写出方法,数据原样写出;

    例如:打印 97,则文件中也为 97;打印 true,文件中也为 true

  • 具有特殊的写出方法,可以实现自动刷新、自动换行;

    打印一次数据 = 写出 + 换行 + 刷新,换行与刷新在底层自动完成;

4-8.2 字节打印流

PrintStream 在输出流的基础上添加了一些额外功能:更方便地打印数据值的表示,以及两项其他功能。

不像其他流,PrintStream 从不会抛出 IOException 异常。相反,异常情况只是在内部设置一个可以通过 checkError 方法测试的标志。

构造方法

构造方法 描述
PrintStream(File file)
PrintStream(File file, String csn)
PrintStream(File file, Charset charset)
PrintStream(String fileName)
PrintStream(String fileName, String csn)
PrintStream(String fileName, Charset charset)
使用平台默认或指定字符集,创建一条关联指定文件的打印流,但不会自动行刷新
PrintStream(OutputStream out)
PrintStream(OutputStream out, boolean autoFlush)
PrintStream(OutputStream out, boolean autoFlush, String encoding)
PrintStream(OutputStream out, boolean autoFlush, Charset charset)
使用平台默认或指定字符集,创建一条关联指定输出流的打印流,但不会自动行刷新
  • 无论是哪种构造,在底层都会调用包装了基本流的构造方法;

    为了效率,考虑在参数中包装基本流(new);

  • 字节流不存在缓冲区,因此自动刷新的影响不大;

写出与打印

方法 说明 描述
void write(int b)
void write(byte[] buf)
void write(byte[] buf, int off, int len)
常规方法 将指定字节写出到流上,规则和以前一样
void print(boolean/char/char[]/double/float/int/long/Object/String) 特有方法 将指定数据写出到流上,不换行
void println()
void println(boolean/char/char[]/double/float/int/long/Object/String)
特有方法 将特定数据写出到流上,并换行
PrintStream printf(String format, Object... args) 特有方法 带有占位符的打印语句,不换行

占位符

查看官方文档:Formatter (Java SE 17 & JDK 17) (oracle.com)

占位符 参数分区 描述
b, B 通用 若参数为null,则结果为 false。若参数为布尔表达式,则结果为 String.valueOf(arg),否则为 true
h, H 通用 结果为 Integer.toHexString(arg.hashCode())
s, S 通用 若参数实现了 Formattable 接口,则调用 arg.formatTo。否则,结果为 arg.toString
c, C 字符 结果为 Unicode 字符
d 整体 结果格式化为十进制整数
o 整体 结果格式化为八进制整数
x, X 整体 结果格式化为十六进制整数
e, E 浮点 结果格式化为计算机科学计数法表示的十进制数字
f 浮点 结果格式化为十进制数
g, G 浮点 结果根据精度和舍入后的值,格式化为用计算机科学计数法表示的数字或十进制格式
a, A 浮点 结果格式化为带有尾数和指数的十六进制浮点数。该转换不支持 BigDecimal
t, T 日期/时间 日期与时间字符前缀,见日期/时间转换
& 百分号 百分号本身('\u0025'
n 换行符 基于平台的换行符

4-8.3 字符打印流

PrintWriter 将对象的格式化表示打印到文本输出流。该类实现了在 PrintStream 中的 print 方法,但不包含写出原始字节的方法,写出原始字节需要程序使用未编码的字节流。

该类从不抛出 I/O 异常,但是部分构造器会抛出。客户端可通过调用 checkError 查询是否发生错误。

构造方法

构造方法 描述
PrintWriter(File file)
PrintWriter(File file, String csn)
PrintWriter(File file, Charset charset)
PrintWriter(String fileName)
PrintWriter(String fileName, String csn)
PrintWriter(String fileName, Charset charset)
使用平台默认或指定字符集,创建一条关联指定文件的打印流,但不会自动行刷新
PrintWriter(Writer out)
PrintWriter(Writer out, boolean autoFlush)
PrintWriter(OutputStream out)
PrintWriter(OutputStream out, boolean autoFlush)
PrintWriter(OutputStream out, boolean autoFlush, Charset charset)
从已有的输出流创建一条打印流
  • 构造方法与字节打印流相似,此处不再赘述;
  • 字符流底层具有缓冲区,自动刷新应当手动开启;

打印

方法 说明 描述
void write(int c)
void write(char[] buf)
void write(char[] buf, int off, int len)
void write(String s)
void write(String s, int off, int len)
常规方法 将指定字符写出到流上,规则和以前一样
void print(boolean/char/char[]/double/float/int/long/Object/String) 特有方法 将指定数据写出到流上,不换行
void println()
void println(boolean/char/char[]/double/float/int/long/Object/String)
特有方法 将指定数据写出到流上,并换行
PrintWriter printf(String format, Object... args) 特有方法 带有占位符的打印语句,不换行

4-8.4 打印流与标准输出流的关系

可以看到,打印流中的 print, printf, println 方法与我们平常使用的控制台输出语句很像:

System.out.println("Hello world!");

若跟踪方法,会发现我们通过 System 类中的静态变量 out 调用打印方法:

public static final PrintStream out = null;

这个静态变量 out 本质上也属于 PrintStream 打印流的对象。当虚拟机启动时,由虚拟机初始化该对象,并默认指向控制台,由该打印流对象向控制台打印、输出。

这个打印流又被称为标准打印流,每个程序有且只有一个标准打印流,一旦关闭,只能重启程序,因此,不推荐、不建议关闭标准输出流。

此外,还有一个打印流对象 err,它是标准错误流,用于向控制台输出错误语句。同样地,该对象由虚拟机初始化,每个程序有且只有一个,不推荐、也不建议关闭标准错误流。

posted @ 2023-08-20 23:06  Zebt  阅读(26)  评论(0)    收藏  举报