IO流(九):打印流-字节打印流PrintStream、字符打印流PrintWriter

ops/2024/11/20 18:07:49/

目录

1、什么是打印流?

2、字节打印流-PrintStream

2.1 代码演示以及注释

2.2 演示几种字节打印流常用的创建方式

3、字符打印流-PrintWriter

3.1 代码演示以及注释

3.2 演示几种字符打印流常用的创建方式

4、案例-System.out.println();输出内容重定向到指定文件中

5、PrintStream和PrintWriter的共同点和区别


1、什么是打印流?

分为字节打印流(PrintStream)和字符打印流(PrintWriter)

作用:可以实现更方便,更高效的打印数据出去,能实现打印啥出去就是啥。

你写的是什么,就能打印什么,不像字节流字符流那样需要转为字节或者字符。

非常好用,建议开发当中用起来。

2、字节打印流-PrintStream

2.1 代码演示以及注释

java">public class PrintStreamTest1 {public static void main(String[] args) {try (//创建字节打印流PrintStream printStream = new PrintStream("src/main/resources/bbb.txt");) {printStream.println("我是打印流");printStream.println('你');printStream.println(true);//也可以用.write()方法写数据,用法和FileOutputStream一致,推荐使用printStream(),写什么就打印什么printStream.write(97);} catch (Exception e) {e.printStackTrace();}}
}

打印的数据我们可以看到,我们写什么就打印什么,非常好用。

2.2 演示几种字节打印流常用的创建方式

java">public class PrintStreamTest1 {public static void main(String[] args) {try (//创建指定字符集编码的字节打印流PrintStream printStream1 = new PrintStream("src/main/resources/bbb.txt","GBK");//指定自动刷新的字节打印流,需要注意的是要先创建原始流FileOutputStream fileOutputStream = new FileOutputStream("src/main/resources/bbb.txt",true);PrintStream printStream2 = new PrintStream(fileOutputStream,true);//指定自动刷新,且指定编码的字节打印流,需要注意的是要先创建原始流FileOutputStream fileOutputStream1 = new FileOutputStream("src/main/resources/bbb.txt",true);PrintStream printStream3 = new PrintStream(fileOutputStream1,true,"UTF-8");) {printStream1.println("我是指定GBK字符集编码的打印流");printStream2.println("我是自动刷新的打印流");printStream3.println("我是自动刷新且指定UTF-8字符集编码的打印流");} catch (Exception e) {e.printStackTrace();}}
}

从打印出来的数据我们可以看出,打印流能设置字符编码,也能设置自动刷新(会自动将缓冲区中的内容flush输出到目标文件,而不是等到缓冲区满或程序结束时才进行输出。)

由于我们读取bbb.txt时的字符集编码是UTF-8,我们第一行是用GBK字符集编码来打印的,所以出现乱码是正常的。

我们点进去源码可以看到,PrintStream底层还封装了一个缓冲流,我们都知道缓冲流的效率是非常高的。

3、字符打印流-PrintWriter

使用方法和字节打印输出流PrintStream非常类似

3.1 代码演示以及注释

java">public class PrintWriterTest01 {public static void main(String[] args) {try (
//                //创建字符打印流PrintWriter printWriter = new PrintWriter("src/main/resources/bbb.txt");) {printWriter.println("我是字符打印流");printWriter.println('你');printWriter.println(true);//也可以用.write()方法写数据,用法和FileWriter一致,推荐使用PrintWriter,写什么就打印什么printWriter.write(97);} catch (Exception e) {e.printStackTrace();}}
}

3.2 演示几种字符打印流常用的创建方式

需要注意的是,当你想要设置自动刷新且指定字符集编码时,我们需要定义一个原始的字节输出流(FileOutputStream) 来完成这一操作

代码如下,注释写得非常清晰

java">public class PrintWriterTest01 {public static void main(String[] args) {try (//创建指定字符集编码的字符打印流PrintWriter printWriter1 = new PrintWriter("src/main/resources/bbb.txt",Charset.forName("GBK"));//指定自动刷新的字符打印流,需要注意的是要先创建原始流-字符输出流FileWriterFileWriter fileWriter = new FileWriter("src/main/resources/bbb.txt",true);PrintWriter printWriter2 = new PrintWriter(fileWriter,false);//指定自动刷新,且指定编码的字符打印流,需要注意的是要先创建原始流字节输出流FileOutputStreamFileOutputStream fileOutputStream = new FileOutputStream("src/main/resources/bbb.txt",true);PrintWriter printWriter3 = new PrintWriter(fileOutputStream,true,Charset.forName("UTF-8"));) {printWriter1.println("我是指定GBK字符集编码的字符打印流");printWriter2.println("我是不需要自动刷新的字符打印流");printWriter3.println("我是自动刷新且指定UTF-8字符集编码的字符打印流");} catch (Exception e) {e.printStackTrace();}}
}

由于我们读取bbb.txt时的字符集编码是UTF-8,我们第一行是用GBK字符集编码来打印的,所以出现乱码是正常的。

我们点进去源码可以看到,PrintWriter底层也是封装了一个缓冲流。

4、案例-System.out.println();输出内容重定向到指定文件中

我们平时用的最多的一行代码System.out.println(),作用是在控制台输出我们需要打印的日志

java">System.out.println("你好Java");

我们点进去源码可以看到,System.out.println()实际上用到的就是字节打印流PrintStream

既然可以打印日志到控制台,那是不是也可以打印日志到指定的文件呢?

下面我们用代码演示一下,非常简单!

java">  //在日志打印之前,设置日志最终打印的位置即可,非常简单
System.setOut( new PrintStream("src/main/resources/bbb.txt","UTF-8"));
System.out.println("你好Java");

这样输出内容重定向到指定文件中的操作就完成啦!

5、PrintStream和PrintWriter的共同点和区别

共同点:

打印流最核心的功能还是输出数据出去。

打印数据的功能上是一模一样的:都是使用方便,性能高效(核心优势)

区别:

PrintStream继承自字节输出流OutputStream,因此支持写字节数据的方法。

PrintWriter继承自字符输出流Writer,因此支持写字符数据出去。

 

 

 

这就是我对打印流的理解,希望能帮到大家,有问题的地方欢迎大家一起讨论!

后续会不断更新作品,欢迎大家一起讨论学习。❤❤❤


http://www.ppmy.cn/ops/135292.html

相关文章

vue功能基础元素使用

4.:inline"true"元素,能够左右元素保持在同一行 这个好处非常直观,但要注意和el-col同时使用时,就会出现el-input换行,即便调整好,放大缩小也会出现换行问题。 5.filterable 下拉框带搜索功能 6.clearable下…

JSONP处理跨域请求

JSONP 背景 由于浏览器存在安全策略,所以当访问的请求中的协议、域名、端口其中一个与本站不同时就会形成跨域,这里介绍一种比较简单的方案——jsonp。 原理 浏览器对 script、img这些带有src属性的的标签在发送请求时是不会触发跨域的校验&#xff…

tcp的网络惊群问题

1. SO_REUSEPORT 可以解决epoll的惊群问题 但是,现在的 TCP Server,一般都是 多进程多路IO复用(epoll) 的并发模型,比如我们常用的 nginx 。如果使用 epoll 去监听 accept socket fd 的读事件,当有新连接建立时,所有进…

时序数据基础TDEngine

时序数据基础 什么是时序数据?​ 时序数据,即时间序列数据(Time-Series Data),它们是一组按照时间发生先后顺序进行排列的序列数据。日常生活中,设备、传感器采集的数据就是时序数据,证券交易…

数据结构(单向链表——c语言实现)

链式存储的优缺点: 优点: 1、动态分配内存: 链式存储不需要在数据插入之前分配固定大小的数组或内存块,因此它更适合存储动态变化的数据 2、高效的插入和删除操作: 在链表中插入或删除元素只需要调整相邻节点的指…

前端注册代码

代码 <template><el-card class"register" style"max-width: 480px ; background-color: aliceblue;"><template #header><div class"card-header"><span>注册</span></div></template><el…

网络编程-002-UDP通信

1.UDP通信的简单介绍 1.1不需要通信握手,无需维持连接,网络带宽需求较小,而实时性要求高 1.2 包大小有限制,不发大于路径MTU的数据包 1.3容易丢包 1.4 可以实现一对多,多对多 2.客户端与服务端=发送端与接收端 代码框架 收数据方一般都是客户端/接收端 3.头文件 #i…

【Android、IOS、Flutter、鸿蒙、ReactNative 】实现 MVP 架构

Android Studio 版本 Android Java MVP 模式 参考 模型层 model public class User {private String email;private String password;public User(String email, String password) {this.email = email;this.password = password;}public String getEmail() {return email;}…