簡(jiǎn)介:
java.io 提供了兩個(gè)打印流,PrintStream/PrintWriter他們都屬于輸出流。
PrintStream繼承與OutputStream,PirntWriter直接繼承與字符流基類(lèi)Writer。但是兩者都可以接受字節(jié)流/字符流作為構(gòu)造函數(shù)的參數(shù)。
作用:
他們都非常方便的使用于輸出流中,直接使用println();來(lái)輸出任意類(lèi)型的數(shù)據(jù)。
不同:
轉(zhuǎn):
(1)PrintStream是OutputStream的子類(lèi),PrintWriter是Writer的子類(lèi),兩者處于對(duì)等的位置上,所以它們的API是非常相似的。
(2)PrintWriter實(shí)現(xiàn)了PritnStream的所有print方法。
(3)對(duì)于PrintStream,所有println方法都在內(nèi)部調(diào)用相應(yīng)的print方法,比如println(char x)的方法體就是調(diào)用print(x);再寫(xiě)入一個(gè)平臺(tái)相關(guān)的換行符。
(4)PrintStream構(gòu)建時(shí)會(huì)在內(nèi)部new一個(gè)BufferedWriter,所有print方法都在內(nèi)部調(diào)用這個(gè)Writer的write方法(write(String)或write(char[]))——對(duì)于print(char[]),直接調(diào)用write(char[]);對(duì)于其他的print方法,先用String.valueOf獲得參數(shù)的字符串表示,然后調(diào)用write(String)。
(5) PrintWriter,所有println方法也都在內(nèi)部調(diào)用print方法,print方法調(diào)用write方法。傳入OutputStream時(shí),PrintWriter會(huì)在內(nèi)部構(gòu)造一個(gè)BufferedWriter;而傳入Writer時(shí),PrintStream內(nèi)部直接使用該Writer,此時(shí)PrintWriter是否進(jìn)行了緩沖全看該Writer。
所以,對(duì)于使用print系列方法的場(chǎng)合,二者沒(méi)什么區(qū)別。
(6)但是,PrintStream是字節(jié)流,它有處理byte的方法,write(int)和write(byte[],int,int);PrintWriter是字符流,它沒(méi)有處理raw byte的方法。
(7)PrintStream和PrintWriter的auto flushing機(jī)制有點(diǎn)不同,前者在輸出byte數(shù)組、調(diào)用println方法、輸出換行符或者byte值10(即\n)時(shí)自動(dòng)調(diào)用flush方法,后者僅在調(diào)用println方法時(shí)發(fā)生auto flushing。
示例:
(1)PrintStream實(shí)例:
public static void main(String[] args) {
try {
//構(gòu)建一個(gè)字節(jié)輸出流
OutputStream os=new FileOutputStream("d:\\test.txt");
//構(gòu)建緩沖流
BufferedOutputStream bos=new BufferedOutputStream(os);
//構(gòu)建字節(jié)打印流
PrintStream ps=new PrintStream(bos);
//數(shù)據(jù)輸出
//println會(huì)換行輸出,print不會(huì)換行
ps.println(false);//寫(xiě)入boolean型
ps.println("好好學(xué)習(xí),天天向上");//寫(xiě)入字符串
ps.println(3.1415926);//寫(xiě)入double類(lèi)型
ps.println(new Person("小明", 20));//寫(xiě)入person類(lèi)型
//關(guān)閉流
ps.close();
bos.close();
os.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
輸出結(jié)果:
false
好好學(xué)習(xí),天天向上
3.1415926
person [name=小明, age=20]
(2)PrintWriter示例:
public static void main(String[] args) {
try {
//構(gòu)建一個(gè)字符輸出流
Writer os=new FileWriter("L:\\test.txt");
//構(gòu)建緩沖流
BufferedWriter bos=new BufferedWriter(os);
//構(gòu)建字符打印流
PrintWriter ps=new PrintWriter(bos);
//println會(huì)換行輸出,print不會(huì)換行
ps.println(false);//寫(xiě)入boolean型
ps.println("好好學(xué)習(xí),天天向上");//寫(xiě)入字符串
ps.println(3);//寫(xiě)入int類(lèi)型
ps.println(new person("小明明", 20));//寫(xiě)入person類(lèi)型
//關(guān)閉流
ps.close();
bos.close();
os.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
輸出結(jié)果:
false
好好學(xué)習(xí),天天向上
3.1415926
person [name=小明, age=20]