打印流解決的就是OutputStream的設計缺陷,屬於OutputStream功能的加強版。如果操作的不是二進制數據,只是想通過程序向終端目標輸出信息的話,OutputStream不是很方便,其缺點有兩個:
- 所有的數據必須轉換爲字節數組。
- 如果要輸出的是int、double等類型就不方便了
打印流概念
打印流設計的主要目的是爲了解決OutputStream的設計問題,其本質不會脫離OutputStream。
範例:自己設計一個簡單打印流
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
class PrintUtil {
private OutputStream out ;
// 由外部傳入要輸出的目標終端
public PrintUtil(OutputStream out) {
this.out = out ;
}
// 核心功能就一個
public void print(String str) {
try {
this.out.write(str.getBytes());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void println(String str) {
this.print(str+"\n");
}
public void print(int data) {
this.print(String.valueOf(data));
}
public void println(int data) {
this.println(String.valueOf(data));
}
public void print(double data) {
this.print(String.valueOf(data));
}
public void println(double data) {
this.println(String.valueOf(data));
}
}
public class TestPrint {
public static void main(String[] args) throws Exception {
PrintUtil printUtil = new PrintUtil(new FileOutputStream(new
File("/Users/yuisama/Desktop/test.txt"))) ;
printUtil.print("姓名:") ;
printUtil.println("fiying fish") ;
printUtil.print("年齡:") ;
printUtil.println(21) ;
printUtil.print("工資: ") ;
printUtil.println(0.0001);
}
}
經過簡單處理之後,讓OutputStream的功能變的更加強大了,其實本質就只是對OutputStream的功能做了一個封裝而已。java提供有專門的打印流處理類:PrintStream、PrintWriter
2.使用系統提供的打印流
打印流分爲字節打印流:PrintStream、字符打印流:PrintWriter,以後使用PrintWriter機率較高。首先來觀察這兩個類的繼承結構與構造方法:
此時看上圖繼承關係我們會發現,有點像之前講過的代理設計模式,但是代理設計模式有如下特點:
- 代理是以接口爲使用原則的設計模式。
- 最終用戶可以調用的方法一定是接口定義的方法。
打印流的設計屬於裝飾設計模式:核心依然是某個類的功能,但是爲了得到更好的操作效果,讓其支持的功能更多一些
範例:使用打印流
public class TestPrint {
public static void main(String[] args) throws Exception {
PrintWriter printUtil = new PrintWriter(new FileOutputStream(new File("/Users/yuisama/Desktop/test.txt"))) ;
printUtil.print("姓名:") ;
printUtil.println("flying fish") ;
printUtil.print("年齡:") ;
printUtil.println(21) ;
printUtil.print("工資: ") ;
printUtil.println(0.00001) ;
printUtil.close();
}
}
以後的開發之中一定會用到打印流。
3.格式化輸出
C語言有一個printf()函數,這個函數在輸出的時候可以使用一些佔位符,例如:字符串(%s)、數字(%d)、小數(%m.nf)、字符(%c)等。從JDK1.5開始,PrintStream類中也追加了此種操作。
格式化輸出:
public PrintStream printf(String format, Object ... args)
範例:觀察格式化輸出
public class TestPrint {
public static void main(String[] args) throws Exception {
String name = "fiyingfish" ;
int age = 21 ;
double salary = 1.10000001 ;
PrintWriter printUtil = new PrintWriter(new FileOutputStream(new
File("/Users/yuisama/Desktop/test.txt"))) ;
printUtil.printf("姓名:%s,年齡:%d,工資:%1.2f", name,age,salary) ;
printUtil.close();
}
}
同時在String類中也追加有一個格式化字符串方法。
格式化字符串:
public static String format(String format, Object... args)
範例:格式化字符串
public class TestPrint {
public static void main(String[] args) throws Exception {
String name = "flyingfish" ;
int age = 21 ;
double salary = 1.1000001 ;
String str = String.format("姓名:%s,年齡:%d,工資:%1.2f",name,age,salary,
name,age,salary) ;
System.out.println(str);
}
}
Ajax都是打印流支撐的