【Java I/O 流】4 - 8 打印流
§4-8 打印流
4-8.1 用于输出的打印流
打印流是一种只用于输出的高级流,其体系如下:
打印流只有输出,没有输入,具有以下三个特点:
-
打印流只操作文件目的地,不操作数据源;
由于打印流只负责输出,因此只写不读,只操作文件目的地,不操作数据源;
-
具有特殊的写出方法,数据原样写出;
例如:打印
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,它是标准错误流,用于向控制台输出错误语句。同样地,该对象由虚拟机初始化,每个程序有且只有一个,不推荐、也不建议关闭标准错误流。
浙公网安备 33010602011771号