小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
文章目录
介绍
PrintStream 是打印输出流,它继承于 FilterOutputStream。
PrintStream 是用来装饰其它输出流。它能为其他输出流添加功能,使它们能够方便地打印各种数据值表示形式。
与其他输出流不同,PrintStream 永远不会抛出 IOException;它产生的 IOException 会被自身的函数所捕获并设置错误标记, 用户可以通过 checkError()
返回错误标记,从而查看 PrintStream 内部是否产生了 IOException。
另外,PrintStream 提供了自动 flush 和 字符集设置功能。所谓自动 flush,就是往 PrintStream 写入的数据会立刻调用flush()
函数。
创建对象
1、将 输出流out
作为 PrintStream 的输出流,不会自动 flush,并且采用默认字符集。所谓 自动flush
,就是每次执行print()
、 println()
、 write()
函数,都会调用flush()
函数;而 不自动flush
,则需要我们手动调用flush()
接口。
PrintStream out = new PrintStream(OutputStream out);
复制代码
2、创建 file 对应的 FileOutputStream,然后将该 FileOutputStream 作为 PrintStream 的输出流。不自动flush,采用默认字符集。
PrintStream out = new PrintStream(File file);
复制代码
3、创建 fileName 对应的 FileOutputStream,然后将该 FileOutputStream 作为 PrintStream 的输出流,不自动 flush,采用 charsetName 字符集。
PrintStream out = new PrintStream(String fileName, String charsetName);
复制代码
方法
1、将数据 b 写入到 PrintStream 输出流中。b 虽然是 int 类型,但实际只会写入一个字节,即输出末尾字节
write(int b)
复制代码
2、将字节数组 buff 全部写入到输出流中
write(byte[] buff)
复制代码
3、将 buffer 中从 from 开始的 length 个字节写入到 PrintStream 输出流中
write(byte[] buff,int from,int length)
复制代码
4、将对象 o 对应的字符串写入到 PrintStream 输出流中,print 实际调用的是 write函数
print(Object o)
复制代码
5、将 换行符 写入到 PrintStream 输出流 中,println 实际调用的是 write 函数。
println()
复制代码
print()
注意: print()
和println()
都是将其中参数转换成字符串之后,再写入到输入流。
例如:
print(0x61);
复制代码
等价于
write(String.valueOf(0x61));
复制代码
所以我们运行 print(0x61);
后会在文件中输出 97。如果我们使用例如 EditPlus 编辑器查看,一般默认都是十进制的。所以我们需要将 0x61 按照十进制方式展示。(和运行 print(97);
结果是相同的)
我们改用 十六进制查看改文件,我们会看到 39 37
对此来解释一下:
每个字符都对应着一个整数编码,例如 a 的整数编码是 97,b 是 98,中文的 “中” 是20013,具体可以查看 ASCII码对照表。下面我列出了我们要用到的:
二进制 | 十进制 | 十六进制 | 图形 |
---|---|---|---|
0000 0000 | 0 | 00 | |
0000 0001 | 1 | 01 | |
0000 0010 | 2 | 02 | |
...... | ...... | ...... | |
0000 0111 | 7 | 07 | |
0000 1000 | 8 | 08 | |
0000 1001 | 9 | 09 | |
0000 1010 | 10 | 0A | |
...... | ...... | ...... | |
0011 0000 | 48 | 30 | 0 |
0011 0001 | 49 | 31 | 1 |
...... | ...... | ...... | ...... |
0011 0111 | 55 | 37 | 7 |
0011 1000 | 56 | 38 | 8 |
0011 1001 | 57 | 39 | 9 |
0110 0000 | 96 | 60 | ` |
0110 0001 | 97 | 61 | a |
0110 0010 | 98 | 62 | b |
0110 0011 | 99 | 63 | c |
...... | ...... | ...... | ...... |
0111 1000 | 120 | 78 | x |
0111 1001 | 121 | 79 | y |
0111 1010 | 122 | 7A | z |
0111 1011 | 123 | 7B | { |
0111 1100 | 124 | 7C | | |
...... | ...... | ...... | ...... |
100111000101101 | 20013 | 4e2d | 中 |
要区分字符 9 和整数编码 9。看图形
这一列的 9 就是字符 9。它的十六进制是 39。
字符 7 的十六进制是37。
所以 out.write(97);
会拆分成9
和7
,所以会输出39 37。
我们只需要记住 print 什么就展示什么
write 什么我们就在对照表中的十进制中找到对应的图形显示即可
我们查看表 十进制的 9 和 7 对应的图形就是 9 和 7
println()
会加入换行符,所以我们运行 out.println(0x61);
会增加一个换行符。
在 windows 中换行符是 \r\n
,它们的十六进制表示为 0D 0A
,所以我们用十六进制查看会是:
write()
运行 write(0x61)
的结果:
0x61 对应的ASCII码的字母 ‘a’。这和运行 write(97)
的结果是一样的。然后我们在ASCII码对照表中的十进制中找到 97
PrintStream 练习
public class Main {
public static void main(String[] args) throws Exception {
PrintStream out = new PrintStream("d:/abc/f6");
out.write(97);
out.write(98);
out.write(99);
out.write(13);//回车符\r
out.write(10);//换行符\n
out.print(97);
out.print(98);
out.println(99);//自动加换行
out.println(3.14);
out.println(new Date());
out.close();
}
}
复制代码
运行程序后会在 D 盘 abc 文件夹下 新建 f6 文件,内容为:
转换为十六进制查看内容
PrintStream 与 DataOutputStream 的区别
这里说一点区别:
PrintStream 会将任何数据,转成字符串输出,out.write(97)
只会输出末尾字节 61。而 DataOutputStream 的out.write(97)
输出完整4字节 00 00 00 61
其他的区别另一个作者总结的很好,可以查看java io系列16之 PrintStream(打印输出流)详解