1. 程式人生 > >Java之路:列印流

Java之路:列印流

如果我們要想進行資料的輸出,首先想到的就是要使用OutputStream類,但這個類在進行輸出資料的時候並不是十分方便。

OutputStream類之中所提供的write()方法只適合輸出位元組陣列,但如果要求輸出字元、數字、日期,OutputStream類就不能很方便地勝任工作了。

在Java的I/O包中,列印流是一個輸出資訊最方便的流類,它可以將原樣輸出各種型別的型別。

除了輸出資料,列印流還提供兩項其他功能:
(1)與其他輸出流不同的是,列印流的方法不會丟擲IOException,其異常情況僅設定內部標誌位, 這些標誌位可通過checkError() 方法來讀取。
(2)列印流具有自動重新整理的功能。

例如,當寫入位元組陣列時,flush()方法會被自動呼叫。

列印流的使用

為了簡化輸出的操作難度,在Java中提供了兩種列印流:PrintStream(位元組列印流)和PrintWriter (字元列印流)

1、PrintStream(位元組列印流)

下面首先以PrintStream類為例進行分析,觀察PrintStream類的繼承結構。

java.lang.Object
|- java.io.OutputStream
|- java.io.FilterOutputStream
    |- java.io.PrintStream

對於列印流而言,它所使用的設計模式稱為裝飾設計模式

,即將一個設計不是非常完善的功能,新增一些程式碼之後變得完善起來。

PrintStream類提供了一系列的print和println方法,可以實現將基本資料型別的格式轉換成字串輸出。在前面的程式中大量用到的“System.out.println”語句中的System.out,就是PrintStream類的一個例項物件。PrintStream有下面幾個構造方法:

PrintStream(OutputStream out)
PrintStream(OutputStream out,boolean autoflush)
PrintStream(OutputStream out,boolean
autoflush, String encoding)

其中,autoflush控制在Java中遇到換行符(\n)時是否自動清空緩衝區,encoding是指定編碼方式

Java的PrintStream物件具有多個過載的print和println方法,它們可輸出各種型別(包括Object)的資料。

對於基本資料型別的資料,print和println方法會先將它們轉換成字串的形式,然後再輸出,而不是輸出原始的位元組內容,如整數221的列印結果是字元“2”、“2”、“1”所組合成的一個字串,而不是整數221在記憶體中的原始位元組資料。

對於一個非基本資料型別的物件,print和println方法會先呼叫物件的toString方法,然後輸出toString方法所返回的字串。

2、PrintWriter (字元列印流)

在Java的I/O包中,提供了一個與PrintStream對應的PrintWriter類,PrintWriter類有下列幾個構造方法:

PrintWriter(OutputStream)
PrintWriter(OutputStream, boolean)
PrintWriter(Writer)
PrintWriter(Writer, boolean)

PrintWriter即使遇到換行符(\n)也不會自動清空緩衝區,只在設定了autoflush模式下使用了println方法後才會自動清空緩衝區。

PrintWriter相對PrintStream最便利的一個地方就是println方法的行為,在Windows下的文字換行是“\r\n”,而在Linux下的文字換行是“\n”。如果希望程式能夠生成平臺相關的文字換行,而不是在各種平臺下都用“\n”作為文字換行,那麼就應該使用PrintWriter的println方法,PrintWriter的println方法能根據不同的作業系統而生成相應的換行符。

【示例1】 :向螢幕輸出資訊

package com.xy.io;

import java.io.PrintWriter;

public class PrintWriterDemo {
	public static void main(String[] args) {
		PrintWriter out = null;
		// 通過System.out對PrintWriter例項化
		out = new PrintWriter(System.out);
		// 向螢幕上輸出
		out.print("Hello world!");
		out.close();
	}
}

【結果】
在這裡插入圖片描述

【示例2】 : 向檔案中輸出資訊

package com.xy.io;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;

public class PrintWriterDemo2 {
	public static void main(String[] args) {
		PrintWriter out = null;
		File f = new File("C:\\Users\\XY\\Desktop\\PrintWriter.txt");
		try {
			/* FileWriter() 建立一個可以寫檔案的Write類
			 * PrintWriter(Writer)
			 * */
			out = new PrintWriter(new FileWriter(f));
		}
		catch(IOException e) {
			e.printStackTrace();
		}
		out.print("Hello world!!!");
		out.close();
	}
}

【結果】
在這裡插入圖片描述

如果由程式向一個終端輸出資料時,一定要使用列印流。