Java中PrintStream 用法

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

文章目录

介绍

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); 会拆分成97,所以会输出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(打印输出流)详解

猜你喜欢

转载自juejin.im/post/7018012951667802142