控制台输出到txt
PrintWriter和PrintStream的區(qū)別與聯(lián)系
PrintStream類和PrintWriter類?
PrintStream主要操作byte流,而PrintWriter用來(lái)操作字符流。讀取文本文件時(shí)一般用后者。
java的一個(gè)字符(char)是16bit的,一個(gè)BYTE是8bit的?
PrintStrean是寫(xiě)入一串8bit的數(shù)據(jù)的。?
PrintWriter是寫(xiě)入一串16bit的數(shù)據(jù)的。?
String缺省是用UNICODE編碼,是16bit的。因此用PrintWriter寫(xiě)入的字符串,跨平臺(tái)性好一些吧。?
PrintStream的可能會(huì)出現(xiàn)字符集亂碼吧。
PrintStream是用來(lái)操作byte,?
PrintWriter是用來(lái)操作Unicode,?
一般需要處理中文時(shí)用PrintWriter好了
Stream用于二進(jìn)制文件(非文本)?
Writer/Reader用于文本文件(雖然也是二進(jìn)制,不過(guò)是按照一定的字符編碼規(guī)則,不像前者)?
當(dāng)然Stream也可用于文本,只不過(guò)比writer/reader來(lái)的麻煩?
PrintStream主要操作byte流,而PrintWriter用來(lái)操作字符流。讀取文本文件時(shí)一般用后者。
?
---------------------------------------------------
?java 輸出流中的PrintStream 和 PrintWriter有什么區(qū)別,好像很多場(chǎng)合都能混用
比如用于網(wǎng)絡(luò)間通信,發(fā)送消息時(shí),可用PrintStream 也可用 PrintWriter
??? eg:
???????? Socket client;
????????? PrintStream output = new PrintStream(client.getOutputStream());
????????? output.println("aaa");
????????? output.flush();
??????? 把上例中的 PrintStream 換成 PrintWriter效果是一樣的。Java I/O流分為兩類,字節(jié)流和字符流。字節(jié)流是指InputStream/OutputStream及其子類,字符流是指Reader/Writer及其子類。這兩類I/O流的class hierarchy基本上是對(duì)等的,InputStreamReader/OutputStreamWriter是InputStream/OutputStream和Reader/Writer之間的橋梁。
???????? PrintStream是OutputStream的子類,PrintWriter是Writer的子類,兩者處于對(duì)等的位置上,所以它們的API是非常相似的。PrintWriter實(shí)現(xiàn)了PritnStream的所有print方法。對(duì)于PrintStream,所有println方法都在內(nèi)部調(diào)用相應(yīng)的print方法,比如println(char x)的方法體就是調(diào)用print(x);再寫(xiě)入一個(gè)平臺(tái)相關(guān)的換行符。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)。
???????? 對(duì)于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ū)別。
???????? 但是,PrintStream是字節(jié)流,它有處理raw byte的方法,write(int)和write(byte[],int,int);PrintWriter是字符流,它沒(méi)有處理raw byte的方法。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。
System.out是PrintStream。其實(shí)這些東西API文檔中都有。
--------------------------------------------------------
?
PrintStream類是過(guò)濾器類中一個(gè)不可忽視的成員,最基本的標(biāo)準(zhǔn)輸出就要借助于它——我們常用的System.out變量就是PrintStream實(shí)例。與之對(duì)應(yīng)的字符流類是PrintWriter類。?
PrintStream有兩個(gè)構(gòu)造函數(shù)(在新版API中已標(biāo)記為過(guò)時(shí)):?
■public PrintStream(OutputStream out)?
■public PrintStream(OutputStream out,boolean autoFlush)?
其中,autoFlush置為true時(shí),每當(dāng)輸出遇到換行符,緩沖區(qū)的內(nèi)容就被強(qiáng)制全部輸出,如同調(diào)用了一次flush()。但要注意,如果沒(méi)遇到換行符,還是會(huì)有數(shù)據(jù)“憋”在緩沖區(qū)里。?
方法(已熟悉的就不解釋):?
■public void write(int b)?
■public void write(byte b,int offset,int length)?
■public void flush()?
■public void close()?
■public void print(Object obj)?
這個(gè)方法功能是 非常強(qiáng)大的,它可以輸出任何對(duì)象,而不必另加說(shuō)明。此外print()方法有許多重載形式,即有多種參數(shù)。它們是字符串(String)、字符數(shù)組 (char[])、字符(char)、整數(shù)(int)、長(zhǎng)整數(shù)(long)、浮點(diǎn)數(shù)(float)、雙精度浮點(diǎn)數(shù)(double)、布爾值 (boolean)。其中,輸出多個(gè)數(shù)單位的print()方法(也就是指參數(shù)為String和char[]的)是同步(synchronized)方 法。?
■public void println()輸出一個(gè)換行符。?
■public synchronized void println(Object obj)?
println()方法有9個(gè)重載形式,幾乎就是print()方法的翻版。唯一的區(qū)別在于println()方法都是同步的。?
■public boolean checkError()?
檢查輸出過(guò)程中有什么錯(cuò)誤,如有,返回true值。只要輸出流中出現(xiàn)一次錯(cuò)誤,則出錯(cuò)后的任意對(duì)checkError()的調(diào)用均會(huì)返回真值。?
下面介紹PrintWriter類。?
如同第二節(jié)中所說(shuō),PrintWriter是JDK1.1版增加了與字節(jié)流I/O相對(duì)應(yīng)的字符流I/O。但是,為了保持兼容性,原先的類幾乎沒(méi)有改 動(dòng)。再加之調(diào)試的需要,PrintStream類被保留,并且System類中的成員變量out、err仍作為它的對(duì)象。然而,PrintWriter用 于大多數(shù)輸出比PrintStream更為合適。因此1.1版的API中建議新開(kāi)發(fā)的代碼使用PrintWriter類,并將 PrintStream類的兩個(gè)構(gòu)造函數(shù)標(biāo)記為過(guò)時(shí)。這樣,雖然使用System.out輸出不會(huì)產(chǎn)生問(wèn)題,在程序中創(chuàng)建新的PrintStream對(duì)象 時(shí)卻會(huì)產(chǎn)生編譯時(shí)的警告。?
PrintWriter類與PrintStream類的方法是對(duì)應(yīng)的。有一個(gè)不同之外需提請(qǐng)讀者注意,就是當(dāng)前者的自動(dòng)清空緩沖區(qū)的功能被使能時(shí)(構(gòu) 造函數(shù)中autoFlush置為true),僅當(dāng)println()方法被調(diào)用時(shí)才自動(dòng)清緩沖區(qū),而不是像PrintStream一樣遇到一個(gè)換行符就清 緩沖。?
PrintStream,它可以將Java的基本資料型態(tài)等資料,直接轉(zhuǎn)換為系統(tǒng)預(yù)設(shè)編碼下對(duì)應(yīng)的字元,再輸出至OutputStream中,而這邊要介 紹的 PrintWriter其功能上與PrintStream類似,除了接受OutputStream之外,它還可以接受Writer物件作為輸出的對(duì)象,當(dāng) 您原先是使用Writer物件在作處理 ,而現(xiàn)在想要套用println()之類的方法時(shí),使用PrintWriter會(huì)是比較方便的作法。?
下面這個(gè)程式顯示了PrintStream與PrintWriter兩個(gè)物件在處理相同輸出目的時(shí)的作法,程式將會(huì)在熒幕上顯示 "簡(jiǎn)體中文" 四個(gè)字元:?
StreamWriterDemo.java?
package onlyfun.caterpillar; import java.io.*;?
public class StreamWriterDemo?
{
?public static void main(String[] args)? {?
try {
byte[] sim = {(byte)0xbc, (byte)0xf2, // 簡(jiǎn)?
(byte)0xcc, (byte)0xe5, // 體?
(byte)0xd6, (byte)0xd0, // 中?
(byte)0xce, (byte)0xc4}; // 文?
InputStreamReader inputStreamReader = new InputStreamReader(new ByteArrayInputStream(sim), "GB2312");?
PrintWriter printWriter =new PrintWriter(new OutputStreamWriter(System.out, "GB2312"));?
PrintStream printStream =new PrintStream(System.out, true, "GB2312");?
int in;?
while((in = inputStreamReader.read()) != -1)? {
printWriter.println((char)in);?
printStream.println((char)in);
}?
inputStreamReader.close();?
printWriter.close();?
printStream.close();?
}?
catch(ArrayIndexOutOfBoundsException e)? {
?e.printStackTrace();
?}?
catch(IOException e) {
?e.printStackTrace();?
}?
}
}
轉(zhuǎn)載于:https://www.cnblogs.com/8335IT/p/3652003.html
總結(jié)
- 上一篇: 创建表空间时ora-01119和ora-
- 下一篇: 第二百四十八天 how can I 坚持