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

本文详细介绍了Java中的PrintStream和PrintWriter打印流,包括它们的构造方法、常用方法、特有功能、字符编码设置、注意事项以及应用场景,帮助开发者理解和正确使用这两种流进行数据输出。
摘要由CSDN通过智能技术生成

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主要用于输出字符数据。根据需要选择适合的打印流,以确保正确地处理数据输出。

  • 19
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: PrintStreamPrintWriter都是Java中的输出类,用于将数据输出到文件或控制台等输出设备。 PrintStream是字节,可以输出字节、字节数组、字符串等数据类型。它的输出目标可以是文件、控制台等。 PrintWriter是字符,可以输出字符、字符串等数据类型。它的输出目标可以是文件、控制台等。 两者的使用方式类似,都可以使用printprintln等方法输出数据。但是,PrintWriterPrintStream更加灵活,可以设置输出编码、自动刷新等属性。因此,在处理文本数据时,建议使用PrintWriter。 ### 回答2: PrintStreamPrintWriter都是Java IO库中的输出类,它们主要用于向外部设备、文件或控制台输出数据。虽然它们的用途类似,但是它们之间也有许多区别。 首先,PrintStreamJava IO流中的一个字节(byte stream),而PrintWriterJava IO流中的一个字符(character stream)。也就是说,PrintStream是用来处理字节数据,而PrintWriter是用来处理字符数据。因此,在处理文本输出时,例如输出字符串时,PrintWriterPrintStream更方便一些。 其次,PrintStream是线程安全的,而PrintWriter则不是。因此,在多线程环境下,PrintStreamPrintWriter更适合使用。 此外,从性能方面来说,PrintStreamPrintWriter更快,因为PrintWriter需要将字符转换为字节再输出,而PrintStream直接输出字节。因此,如果需要处理大量的二进制数据,则使用PrintStream较为合适。 最后需要注意的是,在Java 5之前,PrintStream是用来输出异常信息的首选,因为它可以自动刷新缓冲区。但是,从Java 5开始,PrintWriter也可以自动刷新缓冲区,因此,现在使用PrintWriter来输出异常信息也很常见。 总之,PrintStreamPrintWriter都是用于输出数据的Java IO流类。当需要输出字符数据时,使用PrintWriter更为便捷;当需要输出二进制数据时,使用PrintStream更为高效。在多线程环境下,PrintStreamPrintWriter更加适合使用。 ### 回答3: printstreamprintwriter都是Java IO库中的输出类,用于将数据写入文件或控制台输出。 printstream主要用于输出二进制数据,比如字节数据或者字节,它是OutputStream类的子类,可以将数据输出到文件或者控制台,printstream的最大特点是可以使用print()和println()方法来输出数据,这两个方法默认使用平台的默认字符编码将数据转换为字符输出。printstream还支持设置分隔符,对于数据的分割和处理比较方便,但是不支持Unicode编码。 printwriter主要用于输出文本数据,比如字符数据或者字符,它是Writer类的子类,可以将文本数据输出到文件或者控制台,printwriter也支持使用print()和println()方法来输出数据,但是不同于printstreamprintwriter默认使用Unicode编码输出数据。printwriter还支持自动刷新输出缓冲区,可以保证输出的数据及时更新到目标设备,比如文件或者屏幕。 总体来说,printstreamprintwriter都是很实用的输出类,但是需要根据不同的需求选择合适的类,如果需要处理二进制数据,就使用printstream类,如果需要输出文本数据,就使用printwriter类。另外需要特别注意的是,这两个都是高级,必须在底层的基础上使用,否则无法输出数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

酷小洋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值