一、前言
字符打印流和字节打印流两者是非常类似的。
![image-20240504215214027](https://img-blog.csdnimg.cn/img_convert/23e11a6b3fa41d76a71f663097b9cb06.png)
只不过字符打印流底层多了一个缓冲区,因此字符打印流效率更高一些。
并且在写出数据的时候,如果想要自动刷新,那么必须要手动开启。
想要学习一个类,首先还是要看它的构造方法
二、构造方法
构造方法其实跟字节打印流是一样的。
因此关于字符打印流我们只需要记住:字符流底层有缓冲区,想要自动刷新需要手动开启。
三、成员方法
成员方法基本上也一模一样
![image-20240504215534231](https://img-blog.csdnimg.cn/img_convert/5fe4432486459d1f72a0ab970520ecad.png)
四、代码示例
字符打印流的构造方法还是比较多的,但我们可以将这些构造方法分为三组。
第一组:参数都是关联基本流的,可以关联字符输出流,也可以关联字节输入流。在第一组中是可以开启自动刷新的,因为它有 autoFlush参数
。它还可以指定 字符编码
。
第二组:第一个参数是一个字符串类型所表示的文件路径,第二组构造中是不能开始自动刷新的,但是它可以指定字符编码。
剩下来的就是第三组,在第三组中,第一个参数是 File
所表示的路径,而且在第三组中也无法开启自动刷新。
因此在以后我们真正最常用的其实还是第一组中的两个构造。
那为什么不用第一组的最后一个三个参数的呢?它多出来的参数表示字符编码,而我们以后在实际开发中,默认使用字符编码都是 UTF-8
,因此是不需要指定的。
![image-20240505080958445](https://img-blog.csdnimg.cn/img_convert/0de082f8d0cb461a5e809e1765a96099.png)
如下代码,就算没有关流,这句话也是立马写到本地了,就是因为在这开启了自动刷新。
//1.创建字符打印流的对象
PrintWriter pw = new PrintWriter(new FileWriter("myio\\a.txt"), true);
//2.写出数据
pw.println("今天你终于叫我名字了,虽然叫错了,但是没关系,我马上改");
![image-20240505081520638](https://img-blog.csdnimg.cn/img_convert/01c9319a8301b68dd2ee10a32e78a0b6.png)
但是当你关闭了自动刷新,此时就不会立马写到本地了
完整代码
//1.创建字符打印流的对象
PrintWriter pw = new PrintWriter(new FileWriter("myio\\a.txt"), true);
//2.写出数据
pw.println("今天你终于叫我名字了,虽然叫错了,但是没关系,我马上改");
pw.print("你好你好"); // 表示只打印不换行
pw.printf("%s爱上了%s", "阿珍", "阿强"); // 不换行
//3.释放资源
pw.close();
五、打印流的应用场景
其实我们几乎每天都在用,因为之前每天都会写输出语句,这个里面其实就用到了打印流。
System.out.println("123");
System
:Java里面已经定义好的一个类,而且这个类是用 final
修饰,表示这个类是最终类,不能再有其他的子类了。
![image-20240505082323949](https://img-blog.csdnimg.cn/img_convert/1cba0c8046e81de2b2ed1b7323560f4b.png)
往下找,可以发现:out
是 System类
中的一个静态变量,因此在代码中,我们就可以通过类名直接调用静态变量 System.out
。
out
的类型是 PrintStream
,因此调用 System.out
相当于获取的就是一个打印流的对象。
这个对象是不需要我们自动创建的,而是虚拟机在启动后,由虚拟机自己创建。
这个打印流不是指向文件,而是默认指向控制台。
因此我们可以改写 System.out.println("123")
//获取打印流的对象,此打印流在虚拟机启动的时候,由虚拟机创建,默认指向控制台
//所以这个打印流是一个特殊的打印流,它还有一个特殊的名字:系统中的标准输出流,是不能关闭,在系统中是唯一的。
//如果关闭了就不能再次启动,除非你将虚拟机再次重启一下。
PrintStream ps = System.out;
//拿着对象ps调用打印流中的方法println
//这个方法有三个作用:写出数据,自动换行,自动刷新
ps.println("123");
//只不过平时懒得中间再定义一个变量,因此我们是使用链式编程来书写的
System.out.println("123");