打印流
打印流属于整个Java开发过程中重要的组成概念
现在已经清楚了InputStream和OutputStream两个类的基本使用,如果要进行输出,只能够使用OutputStream类来完成,但是这个类的使用输出是否方便?
如果要用OutputStream输出数据,假设要输出的是String,需要将String变为字节数组后再输出,如果输出的是int需要将int变为字符串在变成字节数组输出,如果是boolean或double呢?
既然OutputStream类有缺陷,我们就希望自己可以创建一个类,这个类支持各种数据类型的输出。
打印流的实现原理
为了解决输出数据时的功能不足,所以在java.io包里面又提供给了一套专门的用于输出数据的类:PrintStream PrintWriter
;
以PrintStream类为例,观察一下继承结构和构造方法:
public PrintStream(OutputStream out);
类似代理的设计,但是不是
在PrintStream类里面提供有一系列的print(),println()方法,这些方法支持各种数据的输出,也就是说如果使用了PrintStream就不会去使用write方法了
但是整个操作过程之中,虽然操作形式不同了,但是本质还是基于OutputStream类的方法完成的。那么这样的设计在我们的java之中称为装饰设计模式。相当于将一个功能不足的操作类,通过某些类的包装,形成更好用的工具类。
class PrintUtil{
private OutputStream output;
public PrintUtil(OutputStream output)
{
this.output=output;
}
//利用String类的输出,进行重载
public void print(int x){
this.print(String.valueOf(x));
}
public void print(double x){
this.print(String.valueOf(x));
}
public void print(String str){
try
{this.output.write(str.getBytes());}
catch(IOException e){
e.getStackTrace();
}
}
public void println(int x ){
this.println(String.valueOf(x));
}
public void println(double x){
this.println(String.valueOf(x));
}
public void println(String str){
this.print(str.concat("\n"));
}
}
public class Main {
public static void main(String[] args) throws Exception {//正常工作一定要通过try catch处理
PrintUtil pu = new PrintUtil(new FileOutputStream("/users/hong/hongs/firsttext.txt"));
pu.println(2);
pu.println(3);
pu.print("hello world");
}
}
在以后的开发过程之中,只要是程序输出内容,都会采用打印流的模式完成,但是请千万切记打印流依然需要OutputStream类的支持。
打印流操作类的使用
JDK1.5的改进,所有的输出数据都要求使用打印流完成,在JDK1.5之后考虑到市场因素,增加了一种输出叫做格式化输出
public PrintStream printf(Locale l, String format,Object... args);
如果要格式化输出就需要一些标记:整数:%d,字符串:%s,小数%m.nf
在开发过程中几乎用不到此类输出,此类输出只是作为使用特色而已。
在JDK1.5之后,String类也发生了一个变化,定义了一个新功能:格式化字符串
- 方法:
public static String format(Locale l, String format,Object... args);
public static String format(String format,Object... args);
日后如果进行程序输出数据的话,绝对要使用打印流