【IO流系列】PrintStream 和 PrintWriter 打印流

打印流

    • 1. 概述
    • 2. 作用
    • 3. `PrintStream` 字节打印流
      • 3.1 构造方法
      • 3.2 常用方法
      • 3.3 特有方法
      • 3.4 代码示例
    • 4. `PrintWriter` 字符打印流
      • 4.1 构造方法
      • 4.2 常用方法
      • 4.3 特有方法
      • 4.4 代码示例
    • 5. 注意事项

1. 概述

PrintStream 和 PrintWriter 都是 Java 中用于输出数据的打印流类,它们分别位于 java.io 包中。

PrintStream

  • PrintStream 是字节打印流类,继承自 OutputStream 类。

  • 可以通过将 System.out 转换为 PrintStream 对象来实现向控制台输出数据。

  • PrintStream 提供了一系列 print() 和 println() 方法,用于打印各种数据类型。

  • PrintStream 对象不抛出 IOException,而是使用标志位来指示是否发生了错误。

PrintWriter

  • PrintWriter 是字符打印流类,继承自 Writer 类。

  • PrintWriter 是 PrintStream 的功能增强版,支持输出字符数据。

  • PrintWriter 可以指定字符编码,在处理中文和特殊字符时更加灵活。

  • PrintWriter 也提供了 print() 和 println() 方法来打印数据,与 PrintStream 类似。

  • PrintWriter 对象在输出数据时可以抛出 IOException 异常。

特点:

  • 特点1:打印流只操作文件目的地,不操作数据源(不能输入,只能输出,即不能读,只能写)

  • 特点2:特有的写出方法可以实现,数据原样写出

    例如 :打印:97文件中:97 ; 打印:true文件中:true

  • 特点3:特有的写出方法,可以实现自动刷新,自动换行

    打印一次数据=写出+换行+刷新

在这里插入图片描述

2. 作用

PrintStream 和 PrintWriter 打印流在 Java 编程中的作用主要是用于方便地输出各种类型的数据到控制台、文件或其他输出目标。

  1. 输出数据类型: PrintStream 和 PrintWriter 类提供了一系列的 print() 和 println() 方法,可以用于输出不同类型的数据,如字符串、整数、浮点数等,而无需手动将它们转换为字符串。

  2. 输出到控制台: 通过将 System.out 转换为 PrintStream 对象,可以方便地将数据输出到控制台(命令行界面)上,用于调试和展示程序执行结果。

  3. 输出到文件: 可以通过创建 FileOutputStream 或其他输出流对象,并将其传递给 PrintStream 或 PrintWriter 的构造函数,实现将数据输出到文件中,用于日志记录或持久化数据存储。

  4. 处理异常: PrintStream 和 PrintWriter 均提供了异常处理机制,例如 PrintWriter 在输出数据时可以抛出 IOException 异常,在处理输出错误时提供了更灵活的方式。

  5. 编码设置: PrintWriter 在输出字符数据时可以设置字符编码,使其更加灵活地处理不同编码的字符数据,尤其适用于处理中文等特殊字符。

3. PrintStream 字节打印流

3.1 构造方法

构造方法说明
public PrintStream(OutputStream/File/String)关联字节输出流/文件/文件路径
public PrintStream(String fileName, Charset charset)指定字符编码
public PrintStream(OutputStream out, boolean autoFlush)自动刷新(字节流底层没有缓冲区,开不开自动刷新都一样)
public PrintStream(OutputStream out, boolean autoFlush, String encoding)指定字符编码且自动刷新
  1. public PrintStream(OutputStream/File/String):这是PrintStream类的构造方法之一,用于实例化一个PrintStream对象,并关联到指定的字节输出流、文件或文件路径。当PrintStream对象被创建后,它会将输出定向到所关联的输出流、文件或文件路径中,可以通过该对象进行输出操作。

  2. public PrintStream(String fileName, Charset charset):这个构造方法创建一个PrintStream对象,并指定使用的字符编码。通过这个构造方法,可以在输出时指定字符编码,确保输出的文本字符按照指定的编码进行转换。

  3. public PrintStream(OutputStream out, boolean autoFlush):这个构造方法创建一个PrintStream对象,并关联到指定的字节输出流。在此构造方法中,可以选择是否需要启用自动刷新功能,对于字节流底层没有缓冲区的情况,开启或关闭自动刷新功能效果相同。

  4. public PrintStream(OutputStream out, boolean autoFlush, String encoding):这个构造方法除了包含了自动刷新功能之外,还允许指定字符编码。该构造方法创建一个PrintStream对象,关联到指定的字节输出流,并指定输出时使用的字符编码,同时可以选择是否启用自动刷新功能。

3.2 常用方法

成员方法说明
public void write(int b)规则跟之前一样,将指定的字节写出

public void write(int b):这是PrintStream类的一个成员方法,用于将指定的字节写出到输出流中。它接受一个整数参数b,表示要写出的字节数据。

3.3 特有方法

特有方法(数据原样写出)说明
public void println(Xxx xx)打印任意数据,自动刷新,自动换行
public void print(Xxx xx)打印任意数据,不换行
public void printf(String format, Object… args)带有占位符的打印语句,不换行
  1. public void println(Xxx xx): 用于将任意类型的数据打印出来,并在打印完成后自动刷新输出流,并换行。可以将各种类型的数据传入该方法,PrintStream对象会自动将其转换为字符串形式并输出到关联的输出流中,然后进行刷新操作,确保输出内容被及时写入目标设备。

  2. public void print(Xxx xx): 用于将任意类型的数据打印出来,但不会在结尾处添加换行符,即不换行。与println方法不同的是,print方法在输出完数据后不会自动进行刷新和换行操作,适合需要连续输出内容而不需要换行的情况。

  3. public void printf(String format, Object... args):用于以指定的格式打印文本,并且支持使用占位符。通过这个方法,可以传入一个格式化字符串和需要填充到占位符中的参数,PrintStream对象将根据格式化字符串的要求进行格式化输出,不会在结尾处添加换行符,实现更加灵活的输出。

3.4 代码示例

  • 代码示例
    package text.IOStream.PrintStream.PrintStream01;import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.PrintStream;
    import java.nio.charset.Charset;/*字节打印流特点1:打印流只操作文件目的地,不操作数据源(不能输入,只能输出,即不能读,只能写)
    特点2:特有的写出方法可以实现,数据原样写出例如:打印:97文件中:97打印:true文件中:true
    特点3:特有的写出方法,可以实现自动刷新,自动换行打印一次数据=写出+换行+刷新| 构造方法                                              | 说明                    |
    | ---------------------------------------------------- | ---------------------------- |
    | public PrintStream(OutputStream/File/String)            | 关联字节输出流/文件/文件路径 |
    | public PrintStream(String fileName,Charset charset)     | 指定字符编码                 |
    | public PrintStream(OutputStream out,boolean autoFlush)  | 自动刷新(字节流底层没有缓冲区,开不开自动刷新都一样)                     |
    | public PrintStream(OutputStream out, boolean autoFlush, String encoding) | 指定字符编码且自动刷新       || 成员方法                 | 说明                             |
    | ------------------------ | -------------------------------- |
    | public void write(int b) | 规则跟之前一样,将指定的字节写出 || 特有方法(数据原样写出)                         | 说明                             |
    | ------------------------------------------------ | -------------------------------- |
    | public void println(Xxx xx)                      | 打印任意数据,自动刷新,自动换行 |
    | public void print(Xxx xx)                        | 打印任意数据,不换行             |
    | public void printf(String format,object... args) | 带有占位符的打印语句,不换行     |*/
    public class PrintStream01 {public static void main(String[] args) throws FileNotFoundException {//创建字节打印流对象PrintStream ps = new PrintStream(new FileOutputStream("D:\\JavaCode\\code\\codeText01\\src\\text\\IOStream\\PrintStream\\PrintStream01\\a.txt"), true, Charset.forName("UTF-8"));//输出数据ps.write(97);//输出97对应的字符ps.println(97);//输出97   写出+自动刷新+自动换行ps.print(true);//写出+自动刷新ps.printf("%s喜欢%s", "小明", "小红");//%s占位符//释放资源ps.close();}
    }
  • 输出结果
    在这里插入图片描述

4. PrintWriter 字符打印流

4.1 构造方法

构造方法说明
public PrintWriter(Writer/File/String)关联字节输出流/文件/文件路径
public PrintWriter(String fileName, Charset charset)指定字符编码
public PrintWriter(Writer w, boolean autoFlush)自动刷新(字符流底层有缓冲区,想要自动刷新就必须打开)
public PrintWriter(OutputStream out, boolean autoFlush, Charset charset)指定字符编码且自动刷新
  1. public PrintWriter(Writer/File/String):通过传入Writer对象、File对象或表示文件路径的String参数,可以创建一个PrintWriter对象并将其与指定的字符输出流或文件关联起来,用于向文件或字符输出流中写入数据。

  2. public PrintWriter(String fileName, Charset charset):该构造方法会创建一个PrintWriter对象,关联指定文件名的文件,并指定字符编码为指定的Charset。通过这个构造方法可以在创建PrintWriter对象的同时设置输出文件名和字符编码。

  3. public PrintWriter(Writer w, boolean autoFlush):用于创建PrintWriter对象,并可选择是否打开自动刷新功能。如果设置为自动刷新,当每次调用print、println或format等方法输出内容时,PrintWriter会自动将数据刷新到底层设备。

  4. public PrintWriter(OutputStream out, boolean autoFlush, Charset charset):用于创建PrintWriter对象,关联指定的字节输出流,并可以指定字符编码以及是否开启自动刷新。通过这个构造方法可以同时设置字符编码和自动刷新功能。

4.2 常用方法

成员方法说明
public void write(int b)规则跟之前一样,将指定的字节写出

public void write(int b): 用于将指定的单个字节写入PrintWriter。它接受一个整数参数b,表示要写入的字节值。该方法会将b的低8位作为一个字节写入输出流中。这种方法适用于需要按字节方式写入数据的场景,比如写入二进制数据或特定编码的字节流。

4.3 特有方法

特有方法(数据原样写出)说明
public void println(Xxx xx)打印任意数据,自动刷新,自动换行
public void print(Xxx xx)打印任意数据,不换行
public void printf(String format, Object… args)带有占位符的打印语句,不换行
  1. public void println(Xxx xx): 用于打印任意数据,并在打印完成后自动刷新输出流,并换行。其中的 Xxx 表示可以是任意类型的数据,比如字符串、整数等。调用该方法将会将指定数据打印到输出流中,然后刷新输出流并换行。

  2. public void print(Xxx xx): 用于打印任意数据,但在打印完成后不会换行,即在同一行输出多个数据。也是 Xxx 表示可以是任意类型的数据。调用该方法将会将指定数据打印到输出流中,但不会自动换行。

  3. public void printf(String format, Object... args): 用于带有占位符的打印语句,允许使用类似于C语言的printf格式化输出。其中的 format 参数是包含占位符的格式化字符串,args 是要填充到占位符的参数。调用该方法将会按照指定的格式将参数填充到占位符中并打印输出,但不会自动换行。

4.4 代码示例

  • 代码示例
    package text.IOStream.PrintStream.PrintStream02;import java.io.FileWriter;
    import java.io.IOException;
    import java.io.PrintWriter;/*字符打印流特点1:打印流只操作文件目的地,不操作数据源(不能输入,只能输出,即不能读,只能写)
    特点2:特有的写出方法可以实现,数据原样写出例如:打印:97文件中:97打印:true文件中:true
    特点3:特有的写出方法,可以实现自动刷新,自动换行打印一次数据=写出+换行+刷新| 构造方法                                              | 说明                    |
    | ---------------------------------------------------- | ---------------------------- |
    | public PrintWriter(Writer/File/String)            | 关联字节输出流/文件/文件路径 |
    | public PrintWriter(String fileName,Charset charset)     | 指定字符编码                 |
    | public PrintWriter(Writer w,boolean autoFlush)  | 自动刷新(字符流底层有缓冲区,想要自动刷新就必须打开)                     |
    | public PrintWriter(OutputStream out, boolean autoFlush,Charset charset ) | 指定字符编码且自动刷新| 成员方法                 | 说明                             |
    | ------------------------ | -------------------------------- |
    | public void write(int b) | 规则跟之前一样,将指定的字节写出 || 特有方法(数据原样写出)                         | 说明                             |
    | ------------------------------------------------ | -------------------------------- |
    | public void println(Xxx xx)                      | 打印任意数据,自动刷新,自动换行 |
    | public void print(Xxx xx)                        | 打印任意数据,不换行             |
    | public void printf(String format,object... args) | 带有占位符的打印语句,不换行     |*/
    public class PrintStream02 {public static void main(String[] args) throws IOException {//创建对象PrintWriter pw = new PrintWriter(new FileWriter("D:\\JavaCode\\code\\codeText01\\src\\text\\IOStream\\PrintStream\\PrintStream02\\a.txt"), true);//输出数据pw.println("今天天气不错!");pw.print("确实可以!");pw.printf("%s想要和%s出去游泳!", "小明", "小红");//释放资源pw.close();}
    }
  • 输出结果
    在这里插入图片描述

5. 注意事项

  1. 字符编码:PrintStream和PrintWriter都可以指定字符编码来进行字符输出,默认情况下使用平台默认的字符编码。在处理含有非ASCII字符的文本时,特别是在跨平台应用中,应该明确指定字符编码,以避免出现乱码问题。

  2. 刷新与关闭:在写入数据到PrintStream和PrintWriter之后,可以调用flush()方法来刷新输出流,确保缓冲区中的数据被全部写出。另外,在程序结束前应当调用close()方法关闭流,以确保资源得到释放并数据得到完整输出。

  3. 自动刷新:PrintWriter具有自动刷新功能,即在使用println()方法输出数据时,会自动刷新输出流,而PrintStream则没有这种自动刷新的功能。所以,在使用PrintStream时需要注意手动调用flush()方法来刷新输出流。

  4. 异常处理:在使用PrintStream和PrintWriter进行输出操作时,应当适时处理可能抛出的IO异常,比如IOException。建议使用try-with-resources语句或者在finally块中关闭流并处理异常,以确保程序稳定性。

  5. 区分用途:PrintStream主要用于输出字节数据,而PrintWriter主要用于输出字符数据。根据需要选择适合的打印流,以确保正确地处理数据输出。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/500078.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙OpenHarmony多线程能力场景化示例实践

简介 在OpenHarmony应用中,每个 进程 都会有一个主线程,主线程主要承担执行UI绘制操作、管理ArkTS引擎实例的创建和销毁、分发和处理事件、管理Ability生命周期等职责,具体可参见 线程模型概述 。因此,开发应用时应当尽量避免将耗…

基于YOLOv8深度学习的复杂场景下船舶目标检测系统【python源码+Pyqt5界面+数据集+训练代码】深度学习实战、目标检测

《博主简介》 小伙伴们好,我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源,可关注公-仲-hao:【阿旭算法与机器学习】,共同学习交流~ 👍感谢小伙伴们点赞、关注! 《------往期经典推…

ANTLR4规则解析生成器(三):遍历语法分析树

文章目录 1 词法分析2 语法分析3 遍历语法分析树3.1 Listener3.2 Visitor 4 总结 1 词法分析 词法分析就是对给定的字符串进行分割,提取出其中的单词。 在antlr4中,词法规则的名称的首字母需要大写,右侧必须是终结符,通常将词法…

[AutoSar]BSW_Com06 CAN报文应用层到Can总线的函数调用

目录 关键词平台说明一、背景二、PDU转换三、函数调用 关键词 嵌入式、C语言、autosar、OS、BSW 平台说明 项目ValueOSautosar OSautosar厂商vector ,芯片厂商TI 英飞凌编程语言C,C编译器HighTec (GCC)autosar版本4.3.X >>>>>回到总目…

音频筑基:CD还是HiRes?高清音频分类一文说透

音频筑基:CD还是HiRes?高清音频分类一文说透 前言音乐品质分类相关资料 前言 音频信号中,经常遇到高清音乐、无损音质、CD、HiRes等说法,本文主要在纯数字信号级别,从音源分类和编码质量两个维度,做一个分析…

【QT+QGIS跨平台编译】之五十八:【QGIS_CORE跨平台编译】—【qgsexpression_texts.cpp生成】

文章目录 一、Python二、生成来源三、构建过程3.1 构建qgsexpression_texts.cpp.temp3.2 构建qgsexpression_texts.cpp一、Python python.exe 是 Python 解释器的可执行文件,用于在命令行中运行 Python 脚本。它是 Python 编程语言的解释器程序,负责解析和执行 Python 代码。…

林浩然与杨凌芸的Scala编程历险记:变量与数据类型的魔法对决

林浩然与杨凌芸的Scala编程历险记:变量与数据类型的魔法对决 在Scala世界的梦幻殿堂中,两位英勇的程序员——林浩然和杨凌芸正准备开启一场代码之旅。这次,他们将深入探索Scala王国中的变量奥秘与数据类型丛林。 一、变量声明篇 &#xff0…

Linux|centos7|yum和编译安装ImageMagick记录

一, yum安装imagemagick imagemagick这个软件是图像文件的处理神器,可以文字转图像以及图像的剪辑等等工作,也是配合人工智能工程的不可或缺的工具,具体的用处和特点就不在这里废话了,有兴趣的百度就行了 本次是在…

【Redis】深入理解 Redis 常用数据类型源码及底层实现(6.详解Set和ZSet数据结构)

本文是深入理解 Redis 常用数据类型源码及底层实现系列的第6篇~前5篇可移步( ̄∇ ̄)/ 【Redis】深入理解 Redis 常用数据类型源码及底层实现(1.结构与源码概述)-CSDN博客 【Redis】深入理解 Redis 常用数据类型源码及底…

【电路笔记】-RC网络-RC积分器

RC积分器 文章目录 RC积分器1、概述2、RC积分器3、电容电压4、单脉冲 RC 积分器5、RC积分器示例6、RC 积分器作为正弦波发生器7、总结RC 积分器是一个串联的 RC 网络,可产生与积分的数学过程相对应的输出信号。 1、概述 对于无源 RC 积分器电路,输入连接到电阻,而输出电压取…

Mybatis plus批量插入的优化

目录 1 前言 2 优化 2.1 逐条的插入 2.1.1 java的代码如下 2.1.2 耗时 2.1.3 优化 2.2 批量编译再插入 2.2.1 java的代码如下 2.2.2 耗时 2.2.3 疑问 2.2.4 优化 2.3 真-批量插入 1 前言 数据库的常见操作无非增删查改,当有大量数据需要插入的时候&…

[云原生] K8s之pod进阶

一、pod的状态说明 (1)Pod 一直处于Pending状态 Pending状态意味着Pod的YAML文件已经提交给Kubernetes,API对象已经被创建并保存在Etcd当中。但是,这个Pod里有些容器因为某种原因而不能被顺利创建。比如,调度不成功(…