新聞中心
TextWriter 和 StreamWriter

我們提供的服務(wù)有:成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)、微信公眾號(hào)開(kāi)發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、金鄉(xiāng)ssl等。為成百上千家企事業(yè)單位解決了網(wǎng)站和推廣的問(wèn)題。提供周到的售前咨詢(xún)和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的金鄉(xiāng)網(wǎng)站制作公司
目錄:
為何介紹TextWriter?
TextWriter的構(gòu)造,常用屬性和方法
IFormatProvider的簡(jiǎn)單介紹
如何理解StreamWriter?
StreamWriter屬性
StreamWriter示例
本章總結(jié)
為何介紹TextWriter?
就像上篇講述的一樣,對(duì)于重要的基礎(chǔ)技術(shù),我們一定要刨根問(wèn)底,這樣在面對(duì)將來(lái)可能很復(fù)雜的業(yè)務(wù)或技術(shù)時(shí)才能游刃有余,
甚至可以創(chuàng)新出新的解決方案,言歸正傳,想了解StreamWriter 必須了解其父親TextWriter的結(jié)構(gòu)和使用方法。
那么微軟為什么要?jiǎng)?chuàng)建立這個(gè)抽象類(lèi)呢?看下圖
的確可以這樣理解C,C++ ,XAML,Html一切可以寫(xiě)在文本上寫(xiě)的語(yǔ)言都可以用Text這個(gè)詞在抽象,(千萬(wàn)別小看記事本,它才是元老?。?,
聰明的你想到了,今后我們可以自定義一些自己Writer類(lèi)來(lái)實(shí)現(xiàn)我們特定的寫(xiě)功能?,F(xiàn)在我們只要理解TextWriter是一個(gè)抽象的文本寫(xiě)入器,
可以在文本上寫(xiě)入我們想要的格式,可以通過(guò)微軟派生類(lèi)或著自定義派生類(lèi)來(lái)實(shí)現(xiàn)TextWriter的功能。只要你有足夠的想象力就能在創(chuàng)新
出一個(gè)新的派生類(lèi)。
TextWriter的構(gòu)造,常用屬性和方法
以下是TextWriter構(gòu)造函數(shù):
和所有的抽象類(lèi)一樣,該類(lèi)不能直接實(shí)例化,它有2個(gè)構(gòu)造函數(shù)
特別我想說(shuō)下第二個(gè)構(gòu)造函數(shù),大家發(fā)現(xiàn)這個(gè)構(gòu)造有個(gè)IFomatProvider類(lèi)型的參數(shù), 這個(gè)是什么東東?
IFormatProvider接口的簡(jiǎn)單介紹
其實(shí)IFormatProvider接口 從字面上就能理解了,一個(gè)格式化的提供者
大家記得我們常用的string.format(“{0:P}”,data);么? IFormatProvider在這里被隱式的調(diào)用了
關(guān)于隱式調(diào)用的各種方式,用個(gè)簡(jiǎn)單的例子向大家說(shuō)明下:
- //有關(guān)數(shù)字格式化隱性使用IFomatProvider的例子
- #iftrue
- //貨幣
- Console.WriteLine(string.Format("顯示貨幣格式{0:c3}",12));
- //十進(jìn)制
- Console.WriteLine("顯示貨幣十進(jìn)制格式{0:d10}", 12);
- //科學(xué)計(jì)數(shù)法
- Console.WriteLine("科學(xué)計(jì)數(shù)法{0:e5}",12);
- //固定點(diǎn)格式
- Console.WriteLine("固定點(diǎn)格式 {0:f10}",12);
- //常規(guī)格式
- Console.WriteLine("常規(guī)格式{0:g10}",12);
- //數(shù)字格式(用分號(hào)隔開(kāi))
- Console.WriteLine("數(shù)字格式 {0:n5}:",666666666);
- //百分號(hào)格式
- Console.WriteLine("百分號(hào)格式(不保留小數(shù)){0:p0}",0.55);
- //16進(jìn)制
- Console.WriteLine("16進(jìn)制{0:x0}", 12);
- //0定位器 此示例保留5位小數(shù),如果小數(shù)部分小于5位,用0填充
- Console.WriteLine("0定位器{0:000.00000}",1222.133);
- //數(shù)字定位器
- Console.WriteLine("數(shù)字定位器{0:(#).###}", 0200.0233000);
- //小數(shù)
- Console.WriteLine("小數(shù)保留一位{0:0.0}", 12.222);
- //百分號(hào)的另一種寫(xiě)法,注意小數(shù)的四舍五入
- Console.WriteLine("百分號(hào)的另一種寫(xiě)法,注意小數(shù)的四舍五入{0:0%.00}", 0.12345);
- Console.WriteLine(" ");
- #endif
輸出結(jié)果:
也就是說(shuō)IFormatProvider 提供了一個(gè)格式化的工具。
讓我們通過(guò)NumberFormatInfo類(lèi)來(lái)溫故下:
這個(gè)密封類(lèi)實(shí)現(xiàn)了IFormatProvider接口,主要實(shí)現(xiàn)了一個(gè)數(shù)字格式化的類(lèi),下面是一些規(guī)定的格式說(shuō)明符:
|
c、C |
貨幣格式。關(guān)聯(lián)的屬性包括: |
|
d、D |
十進(jìn)制格式。 |
|
e、E |
科學(xué)計(jì)數(shù)(指數(shù))格式。 |
|
f、F |
固定點(diǎn)格式。 |
|
g、G |
常規(guī)格式。 |
|
n、N |
數(shù)字格式。 |
|
p、P |
百分比格式。 |
讓我們用簡(jiǎn)單易懂的代碼來(lái)實(shí)現(xiàn)下NumberFormatInfo 如何使用:
- #iftrue
- //顯性使用IFomatProvider
- Console.WriteLine("顯性使用IFomatProvider的例子");
- //實(shí)例化numberFomatProvider對(duì)象
- NumberFormatInfo numberFomatProvider = newNumberFormatInfo();
- //設(shè)置該provider對(duì)于貨幣小數(shù)的顯示長(zhǎng)度
- numberFomatProvider.CurrencyDecimalDigits = 10;
- //注意:我們可以使用C+數(shù)字形式來(lái)改變provider提供的格式
- Console.WriteLine(string.Format(numberFomatProvider, "provider設(shè)置的貨幣格式{0:C}", 12));
- Console.WriteLine(string.Format(numberFomatProvider, "provider設(shè)置的貨幣格式被更改了:{0:C2}", 12));
- Console.WriteLine(string.Format(numberFomatProvider, "默認(rèn)百分號(hào)和小數(shù)形式{0:p2}", 0.12));
- //將小數(shù) “.”換成"?"
- numberFomatProvider.PercentDecimalSeparator = "?";
- Console.WriteLine(string.Format(numberFomatProvider, "provider設(shè)置的百分號(hào)和小數(shù)形式{0:p2}", 0.12));
- Console.ReadLine();
- #endif
輸出結(jié)果:
正如上述代碼所表示的,IFormatProvider提供用于檢索控制格式化的對(duì)象的機(jī)制。我們甚至可以自定義provider類(lèi)來(lái)實(shí)現(xiàn)特殊的
字符串格式化,關(guān)于這個(gè)重要的知識(shí)點(diǎn)我會(huì)在另一篇文章中詳細(xì)介紹并且自定義一個(gè)簡(jiǎn)單的FormatInfo類(lèi)
言歸正傳讓我們理解下TextWriter的幾個(gè)重要屬性
*1:Encoding: 可以獲得當(dāng)前TextWriter的Encoding
*2:FormatProvider: 可以獲得當(dāng)前TextWriter的IFormatProvider
*3:NewLine: 每當(dāng)調(diào)用WriteLine()方法時(shí),行結(jié)束符字符串都會(huì)寫(xiě)入到文本流中,該屬性就是讀取
該結(jié)束符字符串
方法:
*1:Close():關(guān)閉TextWriter并且釋放TextWriter的資源
*2:Dispose(): 釋放TextWriter所占有的所有資源(和StreamReader相似,一旦TextWriter被釋放,它所占有的資源例如Stream會(huì)一并釋放)
*3:Flush(): 和Stream類(lèi)中一樣,將緩沖區(qū)所有數(shù)據(jù)立刻寫(xiě)入文件(基礎(chǔ)設(shè)備)
*4:Write()方法的重載(這個(gè)方法重載太多了,所以這里就不全寫(xiě)出了,大家可以參考最后一個(gè)例子的打印結(jié)果)
*5:WriteLine()方法的重載:和Write()方法相比區(qū)別在于每個(gè)重載執(zhí)行完畢之后會(huì)附加寫(xiě)入一個(gè)換行符
如何理解StreamWriter?
首先我們先了解下StreamWriter的概念:實(shí)現(xiàn)一個(gè) TextWriter,使其以一種特定的編碼向流中寫(xiě)入字符。
那會(huì)有很多朋友會(huì)疑惑,StreamWriter和TextWriter有什么區(qū)別?
其實(shí)從名字定義我們便可區(qū)分了,TextWriter分別是對(duì)連續(xù)字符系列處理的編寫(xiě)器,而StreamWriter通過(guò)特定的編碼和流的方式對(duì)數(shù)據(jù)進(jìn)行處理的編寫(xiě)器
StreamWriter的構(gòu)造函數(shù)
*1:public StreamWriter(string path);
參數(shù)path表示文件所在的位置
*2:public StreamWriter(Stream stream, Encoding encoding);
參數(shù)Stream 表示可以接受stream的任何子類(lèi)或派生類(lèi),Encoding表示讓StreamWriter 在寫(xiě)操作時(shí)使用該encoding進(jìn)行編碼操作
*3:public StreamWriter(string path, bool append);
第二個(gè)append參數(shù)非常重要,當(dāng)append參數(shù)為true時(shí),StreamWriter會(huì)通過(guò)path去找當(dāng)前文件是否存在,如果存在則進(jìn)行append或overwrite的操作,否則創(chuàng)建新的文件
*4:public StreamWriter(Stream stream, Encoding encoding, int bufferSize);
bufferSize參數(shù)設(shè)置當(dāng)前StreamWriter的緩沖區(qū)的大小
StreamWriter的屬性
StreamWriter的方法大多都繼承了TextWriter 這里就不在重復(fù)敘述了,這里就簡(jiǎn)單介紹下StreamWriter獨(dú)有的屬性
*1:AutoFlush: 這個(gè)值來(lái)指示每次使用streamWriter.Write()方法后直接將緩沖區(qū)的數(shù)據(jù)寫(xiě)入文件(基礎(chǔ)流)
*2:BaseStream: 和StreamReader相似可以取出當(dāng)前的Stream對(duì)象加以處理
StreamWriter示例
- conststringtxtFilePath = "D:\TextWriter.txt";
- staticvoidMain(string[] args)
- {
- NumberFormatInfo numberFomatProvider = newNumberFormatInfo();
- //將小數(shù) “.”換成"?"
- numberFomatProvider.PercentDecimalSeparator = "?";
- StreamWriterTest test = newStreamWriterTest(Encoding.Default, txtFilePath, numberFomatProvider);
- //StreamWriter
- test.WriteSomthingToFile();
- //TextWriter
- test.WriteSomthingToFileByUsingTextWriter();
- Console.ReadLine();
- }
- }
- ///
- ///TextWriter和StreamWriter的舉例///
- publicclassStreamWriterTest
- {
- ///
- ///編碼///
- privateEncoding _encoding;
- ///
- ///IFomatProvider///
- privateIFormatProvider _provider;
- ///
- ///文件路徑///
- privatestring_textFilePath;
- publicStreamWriterTest(Encoding encoding, stringtextFilePath)
- : this(encoding, textFilePath, null)
- {
- }
- publicStreamWriterTest(Encoding encoding, stringtextFilePath, IFormatProvider provider)
- {
- this._encoding = encoding;
- this._textFilePath = textFilePath;
- this._provider = provider;
- }
- ///
- ///我們可以通過(guò)FileStream 或者 文件路徑直接對(duì)該文件進(jìn)行寫(xiě)操作///
- publicvoidWriteSomthingToFile()
- {
- //獲取FileStream
- using(FileStream stream = File.OpenWrite(_textFilePath))
- {
- //獲取StreamWriter
- using(StreamWriter writer = newStreamWriter(stream, this._encoding))
- {
- this.WriteSomthingToFile(writer);
- }
- //也可以通過(guò)文件路徑和設(shè)置bool append,編碼和緩沖區(qū)來(lái)構(gòu)建一個(gè)StreamWriter對(duì)象
- using(StreamWriter writer = newStreamWriter(_textFilePath, true, this._encoding, 20))
- {
- this.WriteSomthingToFile(writer);
- }
- }
- }
- ///
- ///具體寫(xiě)入文件的邏輯///
- ///StreamWriter對(duì)象
- publicvoidWriteSomthingToFile(StreamWriter writer)
- {
- //需要寫(xiě)入的數(shù)據(jù)
- string[] writeMethodOverloadType =
- {
- "1.Write(bool);",
- "2.Write(char);",
- "3.Write(Char[])",
- "4.Write(Decimal)",
- "5.Write(Double)",
- "6.Write(Int32)",
- "7.Write(Int64)",
- "8.Write(Object)",
- "9.Write(Char[])",
- "10.Write(Single)",
- "11.Write(Char[])",
- "12.Write(String)",
- "13Write(UInt32)",
- "14.Write(string format,obj)",
- "15.Write(Char[])"
- };
- //定義writer的AutoFlush屬性,如果定義了該屬性,就不必使用writer.Flush方法
- writer.AutoFlush = true;
- writer.WriteLine("這個(gè)StreamWriter使用了{(lán)0}編碼", writer.Encoding.HeaderName);
- //這里重新定位流的位置會(huì)導(dǎo)致一系列的問(wèn)題//writer.BaseStream.Seek(1, SeekOrigin.Current);
- writer.WriteLine("這里簡(jiǎn)單演示下StreamWriter.Writer方法的各種重載版本");
- writeMethodOverloadType.ToList().ForEach
- (
- (name) => { writer.WriteLine(name); }
- );
- writer.WriteLine("StreamWriter.WriteLine()方法就是在加上行結(jié)束符,其余和上述方法是用一致");
- //writer.Flush();
- writer.Close();
- }
- publicvoidWriteSomthingToFileByUsingTextWriter()
- {
- using(TextWriter writer = newStringWriter(_provider))
- {
- writer.WriteLine("這里簡(jiǎn)單介紹下TextWriter 怎么使用用戶(hù)設(shè)置的IFomatProvider,假設(shè)用戶(hù)設(shè)置了NumberFormatInfoz.PercentDecimalSeparator屬性");
- writer.WriteLine("看下區(qū)別吧 {0:p10}", 0.12);
- Console.WriteLine(writer.ToString());
- writer.Flush();
- writer.Close();
- }
- }
- }
StreamWriter輸出結(jié)果:
TextWriter 輸出結(jié)果
相信大家看完這個(gè)示例后能對(duì)StreamWriter和TextWriter有一個(gè)更深的理解
本章總結(jié)
本章講述了 TextWriter 和 StreamWriter的一些基本的概念操作和區(qū)別,還有略帶介紹了IFomartProvider接口的基本作用,
由于IFomartProvider也是非常重要的一個(gè)接口,我也會(huì)單獨(dú)寫(xiě)一篇關(guān)于它的博文,至此關(guān)于流的一些準(zhǔn)備工作已經(jīng)完成,
下一章節(jié)將正式介紹Stream的子類(lèi),也是很關(guān)鍵的FileStream類(lèi),謝謝大家支持!
原文鏈接 http://www.cnblogs.com/JimmyZheng/archive/2012/03/25/2416841.html
責(zé)任編輯:彭凡
來(lái)源: 博客園 C#
網(wǎng)站標(biāo)題:溫故而知新之C#中的Stream篇
鏈接分享:http://fisionsoft.com.cn/article/ccsigog.html


咨詢(xún)
建站咨詢(xún)
