天天看點

C# FileStream和StreamWriter用法

  FielStream類操作的是位元組和位元組數組,而stream類操作的是字元資料。字元資料易于使用,但是有些操作,比如随機檔案通路(通路檔案中間某點的資料),就必須由FileStream對象執行。

   FielStream類維護内部檔案指針,該指針指向檔案中進行下一次讀寫操作的位置。

   FileStream隻能處理原始位元組(raw byte),處理原始位元組的功能使用FileStream類可以用于處理任何資料檔案。

   通過讀取位元組資料,FileStream對像可以用于讀取圖像和聲音。代價是FileStream類不能将資料直接讀入字元串

注:FileMode枚舉成員值在檔案存在與不存在時的情況 

Append

 檔案存在時:打開檔案,流指向檔案的末尾,隻能與枚舉FileAcess.Write聯合使用

 檔案不存在時:建立一個新檔案。隻能與枚舉FileAcess.Write聯合使用

Create

 檔案存在時:删除該檔案,然後建立新檔案

 檔案不存在時:建立新檔案

CreateNew

 檔案存在時:抛出異常

 檔案不存在時:建立新檔案

Open

 檔案存在時:打開現有檔案,流指向檔案開頭

 檔案不存在時:抛出異常

OpenOrCreate

 檔案存在時:打開檔案,流指向檔案開頭

 檔案不存在時:建立新檔案

Truhncate

 檔案存在時:打開現有檔案,清除其内容。流指向檔案開頭,保留檔案的初始建立日期。

 檔案不存在時:抛出異常

FileStream對象

FileStream對象表示在磁盤或網絡路徑上指向檔案的流。當類提供向檔案讀寫位元組的方法時,經常使用StreamReader或StreamWriter執行這些功能。這是因為FileStream類操作位元組和位元組數組,而Stream類操作字元資料。字元資料易于使用,但是有些操作比如随機檔案通路,就必須由FileStream對象執行。

FileStream對象的構造函數:

FileStream aFile = new FileStream(“Log.txt”,FileMode.OpenOrCreate);

FileMode枚舉具有幾種成員:

Append------如果檔案存在,就打開檔案,将檔案位置移動到檔案的末尾,并建立一個新檔案。FileMode.Append僅可以與枚舉FileAccess.Write聯合使用

Create------建立新檔案;如果存在這樣的檔案,就破壞它。

CreateNew------建立新檔案,但是如果已經存在此檔案,則抛出異常

Open------打開現有的檔案,但是不存在所指定的檔案,則抛出異常

OpenOrCreate------如果檔案存在,則規定打開檔案,否則就建立新檔案,如果檔案已經存在,則保留在檔案中的資料

Truncate------打開現有檔案,清除其内容,然後我們可以向檔案寫入全新的資料,但是保留檔案的初始建立日期,必須存在有檔案,否則就抛出異常

通路級别

 前面的構造函數預設以隻讀模式打開檔案,需要一個附加參數規定不同的通路級别,此參數是FileAccess參數。

FileStream aFile=new FileStream(”Log.txt”,fileMode.OpenOrCreate,FileAccess.Write)

      FileAccess枚舉有三種類型:Read、Write、ReadWrite.此屬性的作用是:基于使用者的身份驗證級别改變使用者對檔案的通路

 讀取檔案的位置用seek:public long Seek(long offset,SeekOrigin origin)

Long offset是規定檔案指針以位元組為機關的移動距離;SeekOrigin origin是規定開始計算的起始位置,此枚舉包含3個值:Begin,Current和End。

   例:aFile.Seek(8,SeekOrigin.Begin);// SeekOrigin.Begin指得是檔案指針從檔案的第一個位元組起;而參數‘8‘指得是移動到檔案的第8個位元組

   例2:afile.Seek(2,SeekOrigin.Current)//在目前位置開始,再移動2個位元組。

   例3:aFile.Seek(-5,SeekOrigin.End)//在檔案末端位置開始,倒數5個位元組。

【qieyj】:

讀取資料

使用FileStream類讀取資料不像使用StreamReader和StreamWriter類讀取資料那麼容易,這是因為FileStream類隻能處理原始位元組(raw byey),這使得FileStream類可以用于任何資料檔案,而不僅僅是文本檔案,通過讀取位元組資料就可以讀取類似圖像和聲音的檔案。這種靈活性的代價是不能使用它直接讀入字元串,而使用StreamWriter和StreaMeader類卻可以這樣處理,從是有幾種轉換類可以很容易地将位元組數組轉換為字元數組,或者進行相反的操作。

Read()方法是從FileStream對象所指向的檔案通路資料的主要手段:

Public int Read(byte[] array,int offset, int count)//第一個參數是被傳輸進來的位元組數組,用以接受FileStream對象中的資料。第二個參數是位元組數組中開始寫入資料的位置,它通常是0,表示從數組的開端的檔案中向數組寫資料,最後一個參數是規定從檔案中讀出多少位元組。

寫入資料

寫入資料的流程是先擷取位元組數組,再把位元組資料轉換為字元數組,然後把這個字元數組用Write()方法寫入到檔案中,當然在寫入的過程中,可以确定在檔案的什麼位置寫入,寫多少字元等等。

檔案讀寫的範例:

讀取檔案

 using System;

using System.Collections.Generic;

using System.Text;

using System.IO;

namespace myFile

{

     class Program

     {

         static void Main(string[] args)

         {

             byte[] byData = new byte[100];//建立一個FileStream要用的位元組組

             char[] charData = new char[100];//建立一個字元組

             try

             {

                 FileStream aFile = new FileStream("../../../../Data.txt", FileMode.Open);//執行個體化一個FileStream對象,用來操作data.txt檔案,操作類型是

                 aFile.Seek(55, SeekOrigin.Begin);//把檔案指針指向,從檔案開始位置向前55位位元組所指的位元組

                 aFile.Read(byData, 0, 100);//讀取FileStream對象所指的檔案到位元組數組裡

             }

             catch (IOException e)

             {

                 Console.WriteLine("close");

                 return;

             }

             Decoder d = Encoding.UTF8.GetDecoder();//

             d.GetChars(byData, 0, byData.Length, charData, 0);//将編碼位元組數組轉換為字元數組

             Console.WriteLine(charData);

             Console.ReadLine();

             return;

         }

     }

}

寫入檔案:

using System;

using System.Collections.Generic;

using System.Text;

using System.IO;

namespace myFile

{

     class Program

     {

         static void Main(string[] args)

         {

             byte[] byData = new byte[100];//建立一個FileStream要用的位元組組

             char[] charData = new char[100];//建立一個字元組

             try

             {

                 FileStream aFile = new FileStream("../../../../Data.txt", FileMode.Open);//執行個體化一個FileStream對象,用來操作data.txt檔案,操作類型是

                 charData = "我是誰?111?".ToCharArray();//将字元串内的字元複制到字元組裡

                 aFile.Seek(0, SeekOrigin.End);

                 Encoder el = Encoding.UTF8.GetEncoder();//編碼器

                 el.GetBytes(charData, 0, charData.Length, byData, 0, true);

                 aFile.Write(byData, 0, byData.Length);

             }

             catch (IOException e)

             {

                 Console.WriteLine("close");

                 return;

             }

         }

     }

}

【qieyj】:

◆StreamWriter對像

用FileWriter來随機讀取檔案是個好主意,而用StreamWriter可以直接把字元串寫入檔案中,它處理重要的轉換和向FileStream對像寫入工作。建立StreamWriter有很多方法:

FileStream aFile = new FileStream(“Log.txt”,FileMode.CreatcNew);

StreamWriter sw = new StreamWriter(aFile);

也可直接從檔案中建立StreamWriter對象:

  StreamWriter sw = new StreamWriter(“Log.txt”,true);

     後面這個Boolean值規定是附加檔案還是建立新檔案,如果此值為false,則就建立一個新檔案,或者截取現有檔案并打開它。如果此值設定為true,則打開檔案,保留原來的資料,如果找不到檔案,則建立一個新檔案。注意:當建立FileStream對象時,您無法得到選項的範圍。除了使用Boolean值附加或建立新檔案外,我們根本就無法像使用FileStream類時那樣規定FileMode屬性;而且,您也無法設定FileAccess屬性.是以您總是具有對檔案的讀寫特權,為了使用任何進階參數,您必須在FileStream構造函數中規定這些參數,然後在FileStream對象中建立StreamWriter。

例:

using System;

using System.Collections.Generic;

using System.Text;

using System.IO;

namespace StreamWriterFile

{

     class Program

     {

         static void Main(string[] args)

         {

             try

             {

                 FileStream aFile = new FileStream("data1.txt", FileMode.OpenOrCreate);//建立一個fileStream對象

                 StreamWriter sw = new StreamWriter(aFile);//用FileStream對像執行個體一個StreamWriter對象

                 sw.Write("first.");

                 sw.WriteLine("hello world!!!");//寫入字元串,方法WriteLine寫入時後面跟一個換行符

                 sw.Write("This is a");//寫入字元串,方法Write寫入時沒有換行符

                 sw.Write("string of characters.");

                 sw.Close();//用完後必須關閉對像

             }

             catch (IOException e)

             {

                 Console.WriteLine(e.ToString());

             }

         }

     }

}

◆StreamReader對象

1.讀取檔案

輸入流用于從外部源讀取資料,在很多情況下,資料源可以是磁盤上的檔案或網絡的某些位置,任何可能發送資料的位置都可以是資料源,比如網絡應用程式,web服務,甚至是控制台。StreamReader是一個通用類,可以用于任何流;StreamReader對象的建立方式非常類似于StreamWriter對象的建立方式。

StreamWriter類有兩個基本的方法read和readLine

Read()方法将流的下一個字元作為正整數值傳回,如果到達了流的結尾處,則傳回-1

ReadLing()方法是讀取并傳回一行字元,如果傳回為空,那麼就是到達了流的結尾。

ReadEnd()方法讀小檔案最好,它直接讀取完整的檔案并作為字元串傳回。

例:

using System;

using System.Collections.Generic;

using System.Text;

using System.IO;

namespace StreamReaderTest

{

     class Program

     {

         static void Main(string[] args)

         {

             string strLine; 

             try

             {

                 Console.Write("請輸入檔案路徑及檔案名:");

                 string mess = Console.ReadLine();

                 FileStream aFile = new FileStream(mess, FileMode.Open);

                 StreamReader sr = new StreamReader(aFile);//用FileStream對象執行個體化一個StreamReader對象

                 //strLine = sr.ReadToEnd();//讀取完整的檔案,如果用這個方法,就可以不用下面的while循環

                 strLine = sr.ReadLine();//   讀取一行字元并傳回

                 while (strLine != null)

                 {

                     Console.WriteLine(strLine);

                     strLine = sr.ReadLine();

                 }

                 sr.Close();

                 Console.ReadLine();

             }

             catch (IOException e)

             {

                 Console.WriteLine("an IOexception has been thrown!");

                 Console.WriteLine(e.ToString());

                 return;

             }

             return;

         }

     }

}

2.分隔檔案

讀取使用逗号分隔的檔案,string類提供了一種稱為Split()的方法,可以用于将字元串按照提供的分隔符分隔成字元組.

例:

using System;

using System.Collections.Generic;

using System.Text;

using System.IO;

namespace CommaValues

{

     class Program

     {

         static void Main(string[] args)

         {

             while (true)

             {

                 string strLine;

                 string[] strArray;

                 char[] charArray = new Char[] { ',' };

                 Console.Write("請輸入檔案内容以逗号分隔的檔案路徑及檔案名:");

                 string name = Console.ReadLine();

                 try

                 {

                     FileStream aFile = new FileStream(name, FileMode.Open);

                     StreamReader sr = new StreamReader(aFile);

                     strLine = sr.ReadLine();

                     while (strLine != null)

                     {

                         strArray = strLine.Split(charArray);

                         for (int x = 0; x <= strArray.GetUpperBound(0); x++)

                         {

                             Console.WriteLine(strArray[x].Trim());

                         }

                         strLine = sr.ReadLine();

                     }

                     sr.Close();

                     //Console.ReadLine();

                 }

                 catch (IOException e)

                 {

                     Console.WriteLine(e.ToString());

                     return;

                 }

                 //return;

             }

         }

     }

}

在本文介紹的程式中,是把讀取的文本檔案,用一個richTextBox元件顯示出來。要讀取文本檔案,必須使用到'StreamReader'類,這個類是由名字空間'System.IO'中定義的。通過'StreamReader'類的'ReadLine ( )'方法,就可以讀取打開資料流目前行的資料了。下面代碼實作的功能就是讀取'C:file.txt'并在richTextBox1元件中顯示出來:

  FileStream fs = new FileStream ( 'C:\file.txt'  , FileMode.Open , FileAccess.Read ) ;

  StreamReader m_streamReader = new StreamReader ( fs ) ;

  //使用StreamReader類來讀取檔案

  m_streamReader.BaseStream.Seek ( 0 , SeekOrigin.Begin ) ;

null用法

在不知道具體有什麼資料的時候,也即未知,可以用NULL,我們稱它為空,ORACLE中,含有空值的表列長度為零。 ORACLE允許任何一種資料類型的字段為空,除了以下兩種情況: 1、主鍵字段(primary key), 2、定義時已經加了NOT NULL限制條件的字段說明: 1、等價于沒有任何值、是未知數。 2、NULL與0、空字元串、空格都不同。 3、對空值做加、減、乘、除等運算操作,結果仍為空。 4、NULL的處理使用NVL函數。 5、比較時使用關鍵字用“is null”和“is not null”。 6、空值不能被索引,是以查詢時有些符合條件的資料可能查不出來,    count(*)中,用nvl(列名,0)處理後再查。 7、排序時比其他資料都大(索引預設是降序排列,小→大),    是以NULL值總是排在最後。通常,隻有以下四個函數使用null時可以不為空: SQL> SELECT CONCAT('我1ABC的',NULL) FROM DUAL; CONCAT('我1ABC的',NULL) ----------------------- 我1ABC的 S ...

tostring一般是将對象轉換成string型,在.net中,任何對象都有tostring方法,因為任何對象都是從object繼承而來,而object就是有tostring 這個方法,一般對是數值類型,tostring就是将數值類型轉換成string類型,對于一些引用類型,如dataset等,一般tostring是傳回以象的類型名.

tostring方法可重寫,重寫可以實作你所需要功能.

繼續閱讀