Java打印流——PrintStream

我们知道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类。

猜你喜欢

转载自blog.csdn.net/linghuainian/article/details/82936354