如果我们要想进行数据的输出,首先想到的就是要使用OutputStream类,但这个类在进行输出数据的时候并不是十分方便。
OutputStream类之中所提供的write()方法只适合输出字节数组,但如果要求输出字符、数字、日期,OutputStream类就不能很方便地胜任工作了。
在Java的I/O包中,打印流是一个输出信息最方便的流类,它可以将原样输出各种类型的类型。
除了输出数据,打印流还提供两项其他功能:
(1)与其他输出流不同的是,打印流的方法不会抛出IOException,其异常情况仅设置内部标志位, 这些标志位可通过checkError() 方法来读取。
(2)打印流具有自动刷新的功能。 例如,当写入字节数组时,flush()方法会被自动调用。
打印流的使用
为了简化输出的操作难度,在Java中提供了两种打印流:PrintStream(字节打印流)和PrintWriter (字符打印流)。
1、PrintStream(字节打印流)
下面首先以PrintStream类为例进行分析,观察PrintStream类的继承结构。
java.lang.Object
|- java.io.OutputStream
|- java.io.FilterOutputStream
|- java.io.PrintStream
对于打印流而言,它所使用的设计模式称为装饰设计模式,即将一个设计不是非常完善的功能,添加一些代码之后变得完善起来。
PrintStream类提供了一系列的print和println方法,可以实现将基本数据类型的格式转换成字符串输出。在前面的程序中大量用到的“System.out.println”语句中的System.out,就是PrintStream类的一个实例对象。PrintStream有下面几个构造方法:
PrintStream(OutputStream out)
PrintStream(OutputStream out,boolean autoflush)
PrintStream(OutputStream out,boolean autoflush, String encoding)
其中,autoflush控制在Java中遇到换行符(\n)时是否自动清空缓冲区,encoding是指定编码方式。
Java的PrintStream对象具有多个重载的print和println方法,它们可输出各种类型(包括Object)的数据。
对于基本数据类型的数据,print和println方法会先将它们转换成字符串的形式,然后再输出,而不是输出原始的字节内容,如整数221的打印结果是字符“2”、“2”、“1”所组合成的一个字符串,而不是整数221在内存中的原始字节数据。
对于一个非基本数据类型的对象,print和println方法会先调用对象的toString方法,然后输出toString方法所返回的字符串。
2、PrintWriter (字符打印流)
在Java的I/O包中,提供了一个与PrintStream对应的PrintWriter类,PrintWriter类有下列几个构造方法:
PrintWriter(OutputStream)
PrintWriter(OutputStream, boolean)
PrintWriter(Writer)
PrintWriter(Writer, boolean)
PrintWriter即使遇到换行符(\n)也不会自动清空缓冲区,只在设置了autoflush模式下使用了println方法后才会自动清空缓冲区。
PrintWriter相对PrintStream最便利的一个地方就是println方法的行为,在Windows下的文本换行是“\r\n”,而在Linux下的文本换行是“\n”。如果希望程序能够生成平台相关的文本换行,而不是在各种平台下都用“\n”作为文本换行,那么就应该使用PrintWriter的println方法,PrintWriter的println方法能根据不同的操作系统而生成相应的换行符。
【示例1】 :向屏幕输出信息
package com.xy.io;
import java.io.PrintWriter;
public class PrintWriterDemo {
public static void main(String[] args) {
PrintWriter out = null;
// 通过System.out对PrintWriter实例化
out = new PrintWriter(System.out);
// 向屏幕上输出
out.print("Hello world!");
out.close();
}
}
【结果】
【示例2】 : 向文件中输出信息
package com.xy.io;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
public class PrintWriterDemo2 {
public static void main(String[] args) {
PrintWriter out = null;
File f = new File("C:\\Users\\XY\\Desktop\\PrintWriter.txt");
try {
/* FileWriter() 创建一个可以写文件的Write类
* PrintWriter(Writer)
* */
out = new PrintWriter(new FileWriter(f));
}
catch(IOException e) {
e.printStackTrace();
}
out.print("Hello world!!!");
out.close();
}
}
【结果】
如果由程序向一个终端输出数据时,一定要使用打印流。