我们知道Java输出流有OutputStream,怎么又冒出了一个打印流呢?因为OutputStream只有三个write()输出方法,参数全都是字节。如果我们要把String或int或double类型的数据输出,都要先把它们转换成字节或字节数组,再进行write()输出,这样使用起来稍微有点麻烦,所以就有了PrintStream这个类来简化我们的操作。
PrintStream有各种类型数据的print()输出方法,还有println()换行输出。那么它和OutputStream有没有什么关系呢?
它们之间的继承关系如下:
java.lang.Object
java.io.OutputStream
java.io.FilterOutputStream
java.io.PrintStream
原来PrintStream是OutputStream的子类,再来看PrintStream的构造方法(其中一个):
public PrintStream(OutputStream out)
子类接收父类的实例化对象,说明PrintStream类中有一个OutputStream的成员变量,这个构造方法用来给该成员变量赋值。如果我们想要把内容打印到文件,就可以传入FileOutputStream对象;如果我们想要把内容打印到内存,就可以传入ByteArrayOutputStream对象……读到这里,有没有觉得它很像一种设计模式——装饰器模式。OutputStream是抽象构件,定义了一系列方法,FileOutputStream是具体构件,实现了OutputStream定义的那些方法,FilterOutputStream就是抽象装饰类,它接收OutputStream子类作为参数,并且简单的重写了OutputStream的所有方法,PrintStream是具体装饰类,它继承FilterOutputStream的所有方法,并且又额外定义了自己的一些方法(如那些print()方法)。
装饰模式包含如下角色:
- Component: 抽象构件(Transform)
- ConcreteComponent: 具体构件(Car)
- Decorator: 抽象装饰类(Changer)
- ConcreteDecorator: 具体装饰类(Robot、Airplane)
示例:
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintStream;
public class Main {
public static void main(String[] args) throws IOException {
PrintStream p=new PrintStream(new FileOutputStream(new File("e:\\hello.txt")));
String str="hello world";
int i=5;
double d=7.9;
p.println(str);
p.println(i);
p.println(d);
p.close();
}
}
运行结果:
hello world
5
7.9
还有一个类是PrintWriter,与PrintStream相似,实现了PrintStream中的所有 print 方法。PrintStream打印的所有字符都使用平台的默认字符编码转换为字节。在需要写入字符而不是写入字节的情况下,应该使用 PrintWriter类。