Java 输入输出相关概念介绍(File、IO 流)(二十一)(PrintWriter)

223 阅读4分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第21天,点击查看活动详情

上一篇文章我们介绍的是OutputStreamWriter,它的作用就是要将数据从字节流转换成字符流进行输出。这篇文章是我们这个系列的最后一篇文章,我们将要介绍Writer 的另一个子类:PrintWriter。

PrintWriter 的概念

PrintWriter 是打印输出流,以字符为单位。根据它的名字我们就可以看出,它的主要功能就是“打印”。

具体来说就是用于向文本输出流,打印某个对象的,格式化表示形式。

这个功能实现于PrintStream 中的所有print 方法(有很多)。

  • PrintWriter 本身是打印字符流,他的作用在于,将各种java 数据,以字符串的形式,打印到底层字符输出流中(以参数的形式传入PrintWriter),PrintWriter 在创建的时候可以设置autoFlush,如果这个参数为true,那么在调用newLine / println / format 方法的时候都会自动flush,即将底层字符输出流中的字符都flush 到目的位置。

  • 和PrintWriter 比较相似的一个类时PrintStream。PrintStream 可以实现将字节写入底层数据流中,而PrintWriter 没有相关方法来直接将字节写入到底层流中。

  • 不论是PrintWriter还是PrintStream,它们在写入到底层流中的java 基础类型或者java 对象都是以字符串的形式写入的,所以当我们读取之后要做一些处理(比如说编码、字符集的选定等等)。而关于print(Object) 方法,只是将Object 的表示此对象的Object.toString() 这个结果写入到底层流中,所以读取出来之后,并不是像想象中那样强转一下就可以使用,如果要想操作java 基础类型和对象,应该使用对应的流才行,如:DataInputStream/DataOutputStream 和ObjectInputStream/ObjectOutputStream。

PrintWriter 的方法

构造方法

// 根据传入的File 对象,创建PrintWriter 实例
PrintWriter(File file)
// 根据传入的文件和字符集,创建PrintWriter 实例
PrintWriter(File file, String csn)
// 根据传入的OutputStream 对象创建PrintWriter(默认没有自动刷新功能)
PrintWriter(OutputStream out)
// 根据传入的OutputStream 对象创建PrintWriter,根据参数决定是否自动刷新
PrintWriter(OutputStream out, boolean autoFlush)
// 根据指定文件路径,创建五自动行刷新功能的PrintWriter 实例
PrintWriter(String fileName)
// 根据指定文件路径和字符集创建PrintWriter 实例
PrintWriter(String fileName, String csn)
// 根据传入的Writer 创建不带自动行刷新功能的PrintWriter 实例
PrintWriter(Writer out)
// 根据传入的Writer 创建PrintWriter 实例,根据autoFlush 决定是否自动刷新
PrintWriter(Writer out, boolean autoFlush)      创建新 PrintWriter。   

其他方法

因为PrintWriter 的方法比较多,很多功能都很相似,仅仅参数类型不一致。所以就选择其中一些有代表类型的方法进行介绍。

// 向writer 中添加某个字符
PrintWriter append(char c)
// 在流没有关闭的情况下,刷新流,检查错误状态
boolean checkError()
// 清除此流的错误状态
protected  void clearError()   
// 根据参数传入的指定格式字符串和参数,将一个格式化的字符串写入到writer 中
PrintWriter format(Locale l, String format, Object... args)
// 与上述方法功能一致,根据传入的指定格式字符串和参数,将一个格式化字符串写入到writer 中
PrintWriter format(String format, Object... args)
// 打印boolean
void print(boolean b)
// 打印字符
void print(char c)
// 打印字符数组
void print(char[] s)
// 打印整数
void print(int i)
// 打印对象
void print(Object obj)
// 打印字符串
void print(String s)
// 根据传入的指定格式字符串和参数,将格式化的字符串写入此writer
PrintWriter printf(Locale l, String format, Object... args)
// 功能同上
PrintWriter printf(String format, Object... args)  
// 向流中写入行分隔符字符串,终止当前行      
void println()
// 打印整数,同时终止此行
void println(int x)
// 向流中写入字符数组
void write(char[] buf)
// 根据参数,向流中写入字符数组的某一部分
void write(char[] buf, int off, int len)
// 根据参数,向流中写入字符串的某一部分
void write(String s, int off, int len)

使用举例

public static void main(String[] args) throws Exception {
  final char[] arr = {'a', 'b', 'c', 'd', 'e'};
  File file = new File("copy.txt");
  PrintWriter out = new PrintWriter(new FileOutputStream(file));
  out.write(arr);
  out.close();
}

这个例子比较简单,阐述了PrintWriter 的基本用法,其实现的功能就是把字母“abcde”写入到文件“copy.txt”中。

总结

这篇文章讲述了PrintWriter(打印字符输出流)的概念及用法。我们可以看到,这个类的方法很多,超过了之前的几乎每个类的方法的数量。但是万变不离其宗,我们要明确PrintWriter 这个类的本质,就是一个“字符输出流”,同时具有“print” 这个特性,抓住这个类的本质,我们理解和使用它就变得比较容易了。

这篇文章也是这个系列:“Java 输入输出相关概念介绍与总结(File、IO 流)”的最后一篇文章。